java动手动脑异常处理

请阅读并运行AboutException.java示例,然后通过后面的几页PPT了解Java中实现异常处理的基础知识。
import javax.swing.*;

class AboutException {
   public static void main(String[] a) 
   {
      int i=1, j=0, k;
      k=i/j;


    try
    {
        
        k = i/j;    // Causes division-by-zero exception
        //throw new Exception("Hello.Exception!");
    }
    
    catch ( ArithmeticException e)
    {
        System.out.println("被0除.  "+ e.getMessage());
    }
    
    catch (Exception e)
    {
        if (e instanceof ArithmeticException)
            System.out.println("被0除");
        else
        {  
            System.out.println(e.getMessage());
            
        }
    }

    
    finally
     {
             JOptionPane.showConfirmDialog(null,"OK");
     }
        
  }
}

1.Java 中所有可捕获的异常都派生自 Exception 类。

使用java处理异常机制

把可能会发生错误的代码放进try语句块中。 当程序检测到出现了一个错误时会抛出一个异常对象。异常处理代码会捕获并处理这个错误。 catch语句块中的代码用于处理错误。 当异常发生时,程序控制流程由try语句块跳转到catch语句块。 不管是否有异常发生,finally语句块中的语句始终保证被执行。 如果没有提供合适的异常处理代码,JVM将会结束掉整个应用程序。

也可用下图进行表示

异常处理:Java中异常捕获语句

try{用于监控可能发生错误的语句}

catch(异常类型 异常对象引用)

{ 用于捕获并处理异常的代码 }

finally

{ //用于“善后” 的代码 }

不管是否有异常发生,finally语句块中的语句始终保证被执行。

阅读以下代码(CatchWho.java),写出程序运行

package test;

public class Test { 
    public static void main(String[] args) { 
        try { 
                try { 
                    throw new ArrayIndexOutOfBoundsException(); 
                } 
                catch(ArrayIndexOutOfBoundsException e) { 
                       System.out.println(  "ArrayIndexOutOfBoundsException" +  "/内层try-catch"); 
                }
 
            throw new ArithmeticException(); 
        } 
        catch(ArithmeticException e) { 
            System.out.println("发生ArithmeticException"); 
        } 
        catch(ArrayIndexOutOfBoundsException e) { 
           System.out.println(  "ArrayIndexOutOfBoundsException" + "/外层try-catch"); 
        } 
    } 
}

运行结果

 

结果分析:当内层捕获异常并处理后,外层则不再捕获该异常。

写出CatchWho2.java程序运行的结果

public class CatchWho2 { 
    public static void main(String[] args) { 
        try {
                try { 
                    throw new ArrayIndexOutOfBoundsException(); 
                } 
                catch(ArithmeticException e) { 
                    System.out.println( "ArrayIndexOutOfBoundsException" + "/内层try-catch"); 
                }
            throw new ArithmeticException(); 
        } 
        catch(ArithmeticException e) { 
            System.out.println("发生ArithmeticException"); 
        } 
        catch(ArrayIndexOutOfBoundsException e) { 
            System.out.println( "ArrayIndexOutOfBoundsException" + "/外层try-catch"); 
        } 
    } 
}

运行结果

 

 结果分析:当异常未被处理时无法接受新的异常并对其进行处理。

 请阅读 EmbedFinally.java示例,再运行它,观察其输出并进行总结。

public class EmbededFinally {
    public static void main(String args[]) {       
        int result;       
        try {           
            System.out.println("in Level 1");
             try {                
                System.out.println("in Level 2");
                //result=100/0;  //Level 2               
                 try {                  
                     System.out.println("in Level 3");                      
                     result=100/0;  //Level 3                
                }                 
                catch (Exception e) {                    
                    System.out.println("Level 3:" + e.getClass().toString());                
                }                         
                finally {                   
                    System.out.println("In Level 3 finally");               
                }      
                // result=100/0;  //Level 2      
                }            
            catch (Exception e) {
               
                 System.out.println("Level 2:" + e.getClass().toString());           
             }
             finally {               
                System.out.println("In Level 2 finally");           
             }             
            // result = 100 / 0;  //level 1        
        }     
        catch (Exception e) {
            
            System.out.println("Level 1:" + e.getClass().toString());
        
        }
        finally {
           
             System.out.println("In Level 1 finally");
        
        }
    }
}

运行结果

 

 结果分析:当外层异常未被处理时,内层异常不会被处理并且finally也不会执行,当有多层嵌套的finally语句时,异常在不同层次不同位置抛出时,也会导致不同的finally语句块执行顺序。

finally语句块一定会执行吗? 请通过 SystemExitAndFinally.java示例程序回答上述问题

public class SystemExitAndFinally { 
    public static void main(String[] args)
    {    
        try{         
            System.out.println("in main");
            
            throw new Exception("Exception is thrown in main");

                    //System.exit(0);       
        }     
        catch(Exception e)
            {            
            System.out.println(e.getMessage());
            
            System.exit(0);
        
        }       
        finally      
        {          
            System.out.println("in finally");      
        }  
    }
}

结果显示:

 

 结果分析:首先只有与finally对应的try语句得到执行的情况下finally语句才会执行,但如果finally语句之前出现例如System.exit(0) 等使Java虚拟机停止运行的语句时finally语句也不会被执行。

 

posted @ 2022-10-20 17:15  橘子味芬达水  阅读(16)  评论(0编辑  收藏  举报