1. 程式人生 > >課件中動手動腦5

課件中動手動腦5

 

(1)多層的異常捕獲1

原始碼:

public class catch1 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        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"); } } }

執行結果:

我對原始碼及執行結果的理解:

內層的try丟擲ArrayIndexOutOfBoundsException異常然後被內層的catch捕捉,並輸出結果中的第一行,然後異常因為被捕捉,繼續執行外層try中的語句,丟擲了ArithmeticException異常,被外層的catch語句捕捉後輸出結果中的第二行。

(1)多層的異常捕獲2

原始碼:

public class catch2 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        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"); } } }

執行結果:

我對原始碼及執行結果的理解:

內層的try中丟擲了異常ArrayIndexOutOfBoundsException,在內層的catch中沒有辦法捕捉,就跳出了外層的try,被外層的catch捕捉,此時外層的try語句中還有沒有被執行的則直接跳過繼續向下執行。

(1)finally執行機制:

原始碼:

public class finally1 {
    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");
        }    
    }
}

執行結果:

我對原始碼及執行結果的理解:

在多層的try。。Catch()。。Finally執行時,某一層有錯誤被丟擲後,該錯誤只能被本層或者外層的catch所捕捉,也就意味著該錯誤一旦出現,在其之後的所有語句不會被執行,直到其被本層或者更外層的catch所捕捉,該catch之後的語句才能被執行,也就是隻有該catch所在的那一層以及更外層的finally語句才能被執行。

4finally語句塊一定會執行嗎?

 

public class finally2 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
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");        
        }
    }
}

執行結果:

我對原始碼及執行結果的理解:

在執行catch()語句時,呼叫了Systemexitint)方法正常退出,程式就終止了,就不會執行下面的finally語句,所以finally雖用來殿後但並不必須執行。