當(dāng)前位置:
首頁 >
Java异常处理机制很有意思
發(fā)布時間:2023/12/10
52
豆豆
生活随笔
收集整理的這篇文章主要介紹了
Java异常处理机制很有意思
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
版權(quán)聲明:歡迎轉(zhuǎn)載,請注明沉默王二原創(chuàng)。 https://blog.csdn.net/qing_gee/article/details/43015379
錯誤時代碼的13行,為什么不是第10行代碼的錯誤呢,因為finally的作用就是,無論catch有沒有捕獲到錯誤,finally都要執(zhí)行,雖然代碼的第10行已經(jīng)拋出異常了,但是程序會先執(zhí)行finally而不是將catch的錯誤在堆棧中打印出來,因為finally中已經(jīng)出錯了,程序要先把finally中的錯誤進行處理,然后程序?qū)㈠e誤打印出來后,就終止了,這個時候第10行的錯誤也就不會輸出了,假如程序是這樣的package mwq;public class T {public static void main(String[] args) {try {System.out.println(1 / 0);System.out.println("ccccccccccccccccccc");} catch (ArithmeticException e) {System.out.println(1 / 0);System.out.println("aaaaaaaaaaaaaaaaaaa");} finally {System.out.println("bbbbbbbbbbbbbbbb");}}} 那么此時你認為結(jié)果會是怎樣呢,結(jié)果有兩種bbbbbbbbbbbbbbbb Exception in thread "main" java.lang.ArithmeticException: / by zeroat mwq.T.main(T.java:10)
Exception in thread "main" java.lang.ArithmeticException: / by zeroat mwq.T.main(T.java:10) bbbbbbbbbbbbbbbb 為什么會有兩種結(jié)果呢,大多數(shù)情況下,都會先輸出bbbbbbbbbbbbbbbbb,然而由于out對象也是輸入輸出流,JVM在進行處理的時候,少數(shù)情況下會將錯誤信息先打印出來,而后再將out對象的bbbbbbbbbbbbbbb輸出出來,這可能是線程調(diào)度的原因,但是請小伙伴們懷疑我這種結(jié)論,因為我并沒有證明是這種情況。
前言:在網(wǎng)絡(luò)上看到一篇《深入理解Java異常處理機制》,看完感覺自己也有一點小想法,的確在很多Java學(xué)者的眼里,異常處理機制不就是try catch finally嗎,有啥好理解,很多時候,我也經(jīng)常忽略這方面的內(nèi)容,感覺沒什么有意思的,那么我們來扎個小馬步吧。
1.經(jīng)過對原作者的例子改造
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 {boolean b = true;try {if (!tb2()) {return false;}} catch (ArithmeticException e) {System.out.println("tb1 catch the value of b : " + b);b = false;throw e;} finally {System.out.println("tb1 finally b : " + b);}return b;}@SuppressWarnings("finally")public static boolean tb2() throws ArithmeticException {boolean b = true;try {System.out.println(1 / 0);} catch (ArithmeticException e) {System.out.println("tb2 catch the value of b : " + b);b = false;throw e;} finally {System.out.println("tb2 finally b : " + b);return b;}}} 2.我自己感覺有意思的例子package mwq;public class T {public static void main(String[] args) {try {System.out.println(1 / 0);System.out.println("ccccccccccccccccccc");} catch (ArithmeticException e) {System.out.println(1 / 0);System.out.println("aaaaaaaaaaaaaaaaaaa");} finally {System.out.println(1 / 0);System.out.println("bbbbbbbbbbbbbbbb");}}} 第一個例子就不多講了,如果你的答案如下tb2 catch the value of b : true tb2 finally b : false tb1 finally b : true main finally b : false 那么,你就不需要你就可以不看原作者的例子了,不過可以讀讀他那么基礎(chǔ)的理論知識。對于第二個例子,在很多實際的應(yīng)用中用到的很多,正常流程中,就如try語句,大多數(shù)情況下,我們很自覺的加上對應(yīng)的catch語句,至少是catch Exception,那么這個是沒有問題,但是很多時候,我們的catch語句中也有一些邏輯處理,并非簡單的輸出錯誤日志,假如我們在catch中再出現(xiàn)錯誤時,很多時候,catch中我們多數(shù)認為是正常的代碼,于是我們不再對catch中語句進行catch捕獲,那么按照上面的例子,你的答案是這樣的嗎?
錯誤時代碼的13行,為什么不是第10行代碼的錯誤呢,因為finally的作用就是,無論catch有沒有捕獲到錯誤,finally都要執(zhí)行,雖然代碼的第10行已經(jīng)拋出異常了,但是程序會先執(zhí)行finally而不是將catch的錯誤在堆棧中打印出來,因為finally中已經(jīng)出錯了,程序要先把finally中的錯誤進行處理,然后程序?qū)㈠e誤打印出來后,就終止了,這個時候第10行的錯誤也就不會輸出了,假如程序是這樣的package mwq;public class T {public static void main(String[] args) {try {System.out.println(1 / 0);System.out.println("ccccccccccccccccccc");} catch (ArithmeticException e) {System.out.println(1 / 0);System.out.println("aaaaaaaaaaaaaaaaaaa");} finally {System.out.println("bbbbbbbbbbbbbbbb");}}} 那么此時你認為結(jié)果會是怎樣呢,結(jié)果有兩種bbbbbbbbbbbbbbbb Exception in thread "main" java.lang.ArithmeticException: / by zeroat mwq.T.main(T.java:10)
Exception in thread "main" java.lang.ArithmeticException: / by zeroat mwq.T.main(T.java:10) bbbbbbbbbbbbbbbb 為什么會有兩種結(jié)果呢,大多數(shù)情況下,都會先輸出bbbbbbbbbbbbbbbbb,然而由于out對象也是輸入輸出流,JVM在進行處理的時候,少數(shù)情況下會將錯誤信息先打印出來,而后再將out對象的bbbbbbbbbbbbbbb輸出出來,這可能是線程調(diào)度的原因,但是請小伙伴們懷疑我這種結(jié)論,因為我并沒有證明是這種情況。
總結(jié):總體而言,我感覺Java異常處理機制是很有意思,而不簡單。
總結(jié)
以上是生活随笔為你收集整理的Java异常处理机制很有意思的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用WebORB实现flex + .net
- 下一篇: 【Java编码规范】《阿里巴巴Java开