日期: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 }
運行結果以下: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 }
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 }
這兩段代碼的運行截圖分別以下:
說明:那我就把這兩個案例綜合在一塊兒分析吧!首先對比這兩個案例!咱們能夠看到區別,內部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 }
運行結果:
說明:這個問題偏偏說的就是我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 }
運行結果:
說明:這個問題說明即便是finally也不能改變System.exit(0);可以直接退出運行狀態的功能!這多是finally惟一的不執行的狀況!嗯,就目前來看吧,嗯!好像利用關機、任務管理器直接退出eclipse的,我就不說了!
-----------------------------------------------------------------------------------------