Java基礎複習筆記——異常基礎知識(一)
阿新 • • 發佈:2018-12-30
1.論Exception和Error的區別
Exception 和Error都繼承自Throwable父類。 Error是指正常執行情況下,不太可能出現的情況,一旦Error發生一般都會導致程式處於非正常不可恢復的狀態,比如OutOfMemoryError. 而異常是指程式正常執行過程中,可以預料到異常情況,應該是要被捕獲並且被處理的。
那麼問題來了,如何定義一個CheckedException(檢查型異常)?
1.如果繼承自RuntimeException(執行時異常), 那麼就是執行時異常。
2.繼承自Exception,但是沒有繼承RuntimeException,那麼就是CheckedException(檢查型異常)。(Exception下只有RuntimeException和CheckedException,非此即彼)
Try-Catch-Finally 的執行順序:
- 一旦Try 裡丟擲異常, 程式邏輯跳轉去Catch , 捕獲並處理異常
- 處理完異常之後,跳轉去Finally語句,不再執行Try裡面剩下的語句。 那如果Try 裡還有return語句呢?也不再執行。
- Try 和 任意一個 Catch 都有return語句,finally都會執行。那執行順序是怎麼樣的? try -> catch exption -> finally -> return from catch 。 Try block 的return語句只有當沒有異常發生的情況下才會呼叫到,並且是在先運行了finally之後。
- 總而言之: 無異常丟擲,從Try return。有異常丟擲,從catch return。但是之前都會執行finally。
- Catch 還有異常丟擲,finally會執行嗎? 1) 在catch 裡拋異常前後都不能有return語句,編譯不能通過 2)finally 會執行,之後丟擲異常
- 如果Catch和finally都有return語句,從哪裡return? 答案: 從finally return。
只有當如下兩種情況時,finally程式碼塊不會被執行:
- Try 或者catch 裡面呼叫了system.exit(),中止程式執行
- 致命錯誤: 虛擬機器或者作業系統崩潰
NoClassDefFoundError 和 ClassNotFoundException 有什麼區別
- 首先NoClassDefFoundError是Error,ClassNotFoundException是異常
- NoClassDefFoundError通常發生在,當你想用new 建立一個新物件的時候,發現找不到這個物件所對應的類,這是JVM的錯誤,不應該捕獲。
- ClassNotFoundException 發生在動態載入類的時候,比如說Class.forName, 只要保證要載入的類和其依賴的包都在classpath下即可。
異常處理程式碼比較繁瑣並且千篇一律,應該儘量多使用1.7 引入的 try-with-resource 和multiple catch。try with resource 會在編譯的時候自動生成相應的處理邏輯,比如自動按照約定俗成close那些實現了closeable or AutoCloseable的物件。 FYI,Closeable subclass AutoCloseable。 基本上,常見的InputStream, OutputStream, Reader都有實現 Closeable 介面。
異常處理的一些原則
- 不要捕獲Exception,應該捕獲特定異常
- 不要生吞異常!!!
參考自https://blog.csdn.net/ScarlettWen/article/details/81413366