java异常捕获的一点感悟
轉載自? ?java異常捕獲的一點感悟
class Annoyance extends Exception {} class Sneeze extends Annoyance {} class Human { public static void main(String[] args) throws Exception { try { try { throw new Sneeze(); } catch ( Annoyance a ) { System.out.println("Caught Annoyance"); throw a; } } catch ( Sneeze s ) { System.out.println("Caught Sneeze"); return ; } finally { System.out.println("Hello World!"); } } }今天看到這么一段代碼,請問輸出的內容是什么?
先別給出答案,思考一下平時我們寫代碼的過程中,異常捕獲的過程和順序,比如有這么一段代碼:
try { throw new FileNotFoundException(); } catch (IOException e) { } 我們經常能看到這樣的代碼,也就是使用父類能夠捕獲子類的異常,當然所有的異常都是繼承Exception的,那么為什么不用Exception替換所有具體的異常類呢?這個是要考慮到我們對代碼中預期異常的掌握,也就是某些代碼會產生什么樣的異常,程序員應當心中有數,如果全都用Exception的引用來接收,大家都是稀里糊涂的,如何進行處理也會變得難以著手。但如果在Catch代碼塊中不打算做任何處理,僅捕獲而已,那么這時使用Exception也沒什么關系,但正是生產環境下,這樣的情況應該不允許存在的,這個看JDK的源碼就知道了,捕獲異常以后一定要給出提示信息的。以上的代碼證明了,我們可以用父類的引用接受子類的異常對象,那么問題來了,最上面的代碼執行結果是什么呢?答案是:
Caught Annoyance??
Caught Sneeze??
Hello World!??
相信第一行和第三行大家都沒什么疑問了,關鍵是第二行,應該出來嗎?是不是子類捕獲了父類的異常呢?
經過斷點的加入,我們發現,盡管
catch ( Annoyance a )??
這一句使用的是父類的引用,但實際上是子類的對象,這是java中多態的經典表現。在
catch ( Sneeze s )??
為了證明,子類從本質上無法捕獲父類的異常,我們繼續做個試驗:
try { throw new Annoyance(); } catch (Sneeze s) { System.out.println("Caught Sneeze"); return; } finally { System.out.println("Hello World!"); }可以看到,拋出了父類的異常,使用子類catch,這時候可以通過編譯,但運行時呢?
Hello World!??
Exception in thread "main" com.xq.exceptions.Annoyance??
? ? at com.xq.exceptions.Human.main(ExceptionTest.java:14)??
可以看到,出了問題了,也就是說,父類throw出來的異常,子類并沒有捕獲到,繼續往下證明:
try { throw new Annoyance(); } catch (Sneeze s) { System.out.println("Caught Sneeze"); return; } catch (Exception e) { System.out.println("Caught Exception"); return; } finally { System.out.println("Hello World!"); } 既然子類捕獲不了,那就使用Exception,可以看到結果如下:Caught Exception
Hello World!
總結
以上是生活随笔為你收集整理的java异常捕获的一点感悟的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果允许俄罗斯 App 使用第三方支付系
- 下一篇: 英特尔酷睿 Ultra 9 185H 处