Java的動手動腦(六)

 日期:2018.11.8java

星期四eclipse

博客期:022ide

-----------------------------------------------------------------------------------------spa

  Part 1: 基本異常處理3d

 1 package teacher;  2 
 3 import javax.swing.*;  4 
 5 class AboutException {  6    public static void main(String[] a)  7  {  8       int i=1, j=0, k;  9       k=i/j; 10 
11 
12     try
13  { 14         
15         k = i/j;    // Causes division-by-zero exception
16         throw new Exception("Hello.Exception!"); 17  } 18     
19     catch ( ArithmeticException e) 20  { 21         System.out.println("被0除.  "+ e.getMessage()); 22  } 23     
24     catch (Exception e) 25  { 26         if (e instanceof ArithmeticException) 27             System.out.println("被0除"); 28         else
29  { 30  System.out.println(e.getMessage()); 31             
32  } 33  } 34 
35     
36     finally
37  { 38              JOptionPane.showConfirmDialog(null,"OK"); 39  } 40         
41  } 42 }
AboutException.java

  運行結果以下:code

  說明:由於當你的程序出現錯誤的時候,即第一個 k = i / j ;語句執行的時候,你的程序運行到這裏就結束(中斷)了,不可能繼續運行try{}裏的 k = i / j ;語句,因此會是這個結果!而當你將它的第一個 k = i / j; 用//或/**/註釋掉以後 ,運行結果以下:blog

  在你註釋掉了之後,它會繼續執行try{}裏的 k = i / j ;語句,也就會在try{}裏拋出 ArithmeticException ,然後邊恰好有catch 語句接到了,進而作了內部處理,因爲 ArithmeticException 已經獲得了 catch,後面的 catch (Exception e) 就沒有接到,因而不執行,然後面的finally除了特殊狀況,通常是要執行的,因而即是這樣的結果!但若是你把第二個 k = i / j; 也用//或/**/註釋掉以後,運行結果以下:ip

  理由很清晰,就是根據類型執行catch 語句和 finally 語句!get

-----------------------------------------------------------------------------------------博客

  Part 2: 多層的異常捕獲(1+2)

 1 package teacher;  2 
 3 public class CatchWho {  4     public static void main(String[] args) {  5         try {  6                 try {  7                     throw new ArrayIndexOutOfBoundsException();  8  }  9                 catch(ArrayIndexOutOfBoundsException e) { 10                        System.out.println(  "ArrayIndexOutOfBoundsException" +  "/內層try-catch"); 11  } 12  
13             throw new ArithmeticException(); 14  } 15         catch(ArithmeticException e) { 16             System.out.println("發生ArithmeticException"); 17  } 18         catch(ArrayIndexOutOfBoundsException e) { 19            System.out.println(  "ArrayIndexOutOfBoundsException" + "/外層try-catch"); 20  } 21  } 22 }
CatchWho.java
 1 package teacher;  2 
 3 public class CatchWho2 {  4     public static void main(String[] args) {  5         try {  6                 try {  7                     throw new ArrayIndexOutOfBoundsException();  8  }  9                 catch(ArithmeticException e) { 10                     System.out.println( "ArrayIndexOutOfBoundsException" + "/內層try-catch"); 11  } 12             throw new ArithmeticException(); 13  } 14         catch(ArithmeticException e) { 15             System.out.println("發生ArithmeticException"); 16  } 17         catch(ArrayIndexOutOfBoundsException e) { 18             System.out.println( "ArrayIndexOutOfBoundsException" + "/外層try-catch"); 19  } 20  } 21 }
CatchWho2.java

  這兩段代碼的運行截圖分別以下:

  說明:那我就把這兩個案例綜合在一塊兒分析吧!首先對比這兩個案例!咱們能夠看到區別,內部try{}裏的所要catch的異常不一樣——ArrayIndexOutOfBoundsException和ArithmeticException,但到底是什麼緣由致使了這結果的不一樣呢?我來講吧!這無外乎就是這一個catch的嵌套比較特殊!由於它兩層的嵌套有重複的Exception監聽處理,這就產生了另一個問題——到底是哪一個或哪些部分catch到了異常呢?咱們從運行結果中能夠得知,catch是就近原則的,因而只要這個 Exception 被 catch 到了就不能再被非finally的catch語句catch到!因此就是這樣的結果了!由於Exception不屬於內部的catch的要求類型,於是沒有被內部的catch語句catch到,而是外部的catch語句!因此第二個就會執行外部的catch操做!

-----------------------------------------------------------------------------------------

  Part 3: 不一樣的finally語句的順序

 1 package teacher;  2 
 3 public class EmbededFinally {  4 
 5     
 6     public static void main(String args[]) {  7         
 8         int result;  9         
10         try { 11             
12             System.out.println("in Level 1"); 13 
14            
15              try { 16                 
17                 System.out.println("in Level 2"); 18   // result=100/0; //Level 2
19                
20                  try { 21                    
22                      System.out.println("in Level 3"); 23                       
24                      result=100/0;  //Level 3
25                 
26  } 27                 
28                 catch (Exception e) { 29                     
30                     System.out.println("Level 3:" + e.getClass().toString()); 31                 
32  } 33                 
34                 
35                 finally { 36                     
37                     System.out.println("In Level 3 finally"); 38                 
39  } 40                 
41                
42                 // result=100/0; //Level 2
43 
44             
45  } 46             
47             catch (Exception e) { 48                
49                  System.out.println("Level 2:" + e.getClass().toString()); 50            
51  } 52              finally { 53                 
54                 System.out.println("In Level 2 finally"); 55            
56  } 57              
58             // result = 100 / 0; //level 1
59         
60  } 61         
62         catch (Exception e) { 63             
64             System.out.println("Level 1:" + e.getClass().toString()); 65         
66  } 67         
68         finally { 69            
70              System.out.println("In Level 1 finally"); 71         
72  } 73     
74  } 75 
76 }
EmbededFinally.java

  運行結果:

  說明:這個問題偏偏說的就是我Part 2所提到的問題——那個監聽類型重複以後的順序問題!就拿本程序來講,輸出的順序毫無疑問是一、二、3的順序,然後面的finally的執行順序倒是三、二、1的順序,固然這也是很容易理解的——畢竟仍是按順序來講,先執行try內部,當這個try的finally{}結束以後,外部的finally{}才能得以繼續!因此finally的執行順序是從內到外的!

-----------------------------------------------------------------------------------------

  Part 4: 解析finally不執行的特殊狀況

 1 package teacher;  2 
 3 public class SystemExitAndFinally {  4 
 5     
 6     public static void main(String[] args)  7  {  8         
 9         try{ 10 
11             
12             System.out.println("in main"); 13             
14             throw new Exception("Exception is thrown in main"); 15 
16             //System.exit(0);
17         
18  } 19         
20         catch(Exception e) 21 
22  { 23             
24  System.out.println(e.getMessage()); 25             
26             System.exit(0); 27         
28  } 29         
30         finally
31         
32  { 33             
34             System.out.println("in finally"); 35         
36  } 37     
38  } 39 
40 
41 }
SystemExitAndFinally.java

  運行結果:

  說明:這個問題說明即便是finally也不能改變System.exit(0);可以直接退出運行狀態的功能!這多是finally惟一的不執行的狀況!嗯,就目前來看吧,嗯!好像利用關機、任務管理器直接退出eclipse的,我就不說了!

-----------------------------------------------------------------------------------------

相關文章
相關標籤/搜索