天天看點

Java異常處理機制很有意思

前言:在網絡上看到一篇《深入了解Java異常處理機制》,看完感覺自己也有一點小想法,的确在很多Java學者的眼裡,異常處理機制不就是try catch finally嗎,有啥好了解,很多時候,我也經常忽略這方面的内容,感覺沒什麼有意思的,那麼我們來紮個小馬步吧。

1.經過對原作者的例子改造

package mwq;

public class T1 {

public static void main(String[] args) {

 boolean b = true;

 try {

  b = tb1();

 } catch (ArithmeticException e) {

  System.out.println("main catch the value of b : " + b);

  b = false;

  throw e;

 } finally {

  System.out.println("main finally b : " + b);

 }

}

public static boolean tb1() throws ArithmeticException {

  if (!tb2()) {

   return false;

  }

  System.out.println("tb1 catch the value of b : " + b);

  System.out.println("tb1 finally b : " + b);

 return b;

@SuppressWarnings("finally")

public static boolean tb2() throws ArithmeticException {

  System.out.println(1 / 0);

  System.out.println("tb2 catch the value of b : " + b);

  System.out.println("tb2 finally b : " + b);

  return b;

2.我自己感覺有意思的例子

public class T {

  System.out.println("ccccccccccccccccccc");

  System.out.println("aaaaaaaaaaaaaaaaaaa");

  System.out.println("bbbbbbbbbbbbbbbb");

第一個例子就不多講了,如果你的答案如下

tb2 catch the value of b : true

tb2 finally b : false

tb1 finally b : true

main finally b : false

那麼,你就不需要你就可以不看原作者的例子了,不過可以讀讀他那麼基礎的理論知識。

對于第二個例子,在很多實際的應用中用到的很多,正常流程中,就如try語句,大多數情況下,我們很自覺的加上對應的catch語句,至少是catch Exception,那麼這個是沒有問題,但是很多時候,我們的catch語句中也有一些邏輯處理,并非簡單的輸出錯誤日志,假如我們在catch中再出現錯誤時,很多時候,catch中我們多數認為是正常的代碼,于是我們不再對catch中語句進行catch捕獲,那麼按照上面的例子,你的答案是這樣的嗎?

Exception in thread "main" java.lang.ArithmeticException: / by zero

at mwq.T.main(T.java:13)

錯誤時代碼的13行,為什麼不是第10行代碼的錯誤呢,因為finally的作用就是,無論catch有沒有捕獲到錯誤,finally都要執行,雖然代碼的第10行已經抛出異常了,但是程式會先執行finally而不是将catch的錯誤在堆棧中列印出來,因為finally中已經出錯了,程式要先把finally中的錯誤進行處理,然後程式将錯誤列印出來後,就終止了,這個時候第10行的錯誤也就不會輸出了,假如程式是這樣的

那麼此時你認為結果會是怎樣呢,結果有兩種

bbbbbbbbbbbbbbbb

at mwq.T.main(T.java:10)

為什麼會有兩種結果呢,大多數情況下,都會先輸出bbbbbbbbbbbbbbbbb,然而由于out對象也是輸入輸出流,JVM在進行處理的時候,少數情況下會将錯誤資訊先列印出來,而後再将out對象的bbbbbbbbbbbbbbb輸出出來,這可能是線程排程的原因,但是請小夥伴們懷疑我這種結論,因為我并沒有證明是這種情況。

總結:總體而言,我感覺Java異常處理機制是很有意思,而不簡單。