1. 程式人生 > >Java基礎複習筆記——異常基礎知識(一)

Java基礎複習筆記——異常基礎知識(一)

1.論Exception和Error的區別

Exception 和Error都繼承自Throwable父類。 Error是指正常執行情況下,不太可能出現的情況,一旦Error發生一般都會導致程式處於非正常不可恢復的狀態,比如OutOfMemoryError. 而異常是指程式正常執行過程中,可以預料到異常情況,應該是要被捕獲並且被處理的。

那麼問題來了,如何定義一個CheckedException(檢查型異常)?

1.如果繼承自RuntimeException(執行時異常), 那麼就是執行時異常。

2.繼承自Exception,但是沒有繼承RuntimeException,那麼就是CheckedException(檢查型異常)。(Exception下只有RuntimeException和CheckedException,非此即彼)

Try-Catch-Finally 的執行順序:

  1. 一旦Try 裡丟擲異常, 程式邏輯跳轉去Catch , 捕獲並處理異常
  2. 處理完異常之後,跳轉去Finally語句,不再執行Try裡面剩下的語句。 那如果Try 裡還有return語句呢?也不再執行。
  3. Try 和 任意一個 Catch 都有return語句,finally都會執行。那執行順序是怎麼樣的? try -> catch exption -> finally -> return from catch 。 Try block 的return語句只有當沒有異常發生的情況下才會呼叫到,並且是在先運行了finally之後。
  4. 總而言之: 無異常丟擲,從Try return。有異常丟擲,從catch return。但是之前都會執行finally。
  5. Catch 還有異常丟擲,finally會執行嗎? 1) 在catch 裡拋異常前後都不能有return語句,編譯不能通過 2)finally 會執行,之後丟擲異常
  6. 如果Catch和finally都有return語句,從哪裡return? 答案: 從finally return。

只有當如下兩種情況時,finally程式碼塊不會被執行:

  1. Try 或者catch 裡面呼叫了system.exit(),中止程式執行
  2. 致命錯誤: 虛擬機器或者作業系統崩潰

NoClassDefFoundError 和 ClassNotFoundException 有什麼區別

  1. 首先NoClassDefFoundError是Error,ClassNotFoundException是異常
  2. NoClassDefFoundError通常發生在,當你想用new 建立一個新物件的時候,發現找不到這個物件所對應的類,這是JVM的錯誤,不應該捕獲。
  3. 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 介面。

異常處理的一些原則

  1. 不要捕獲Exception,應該捕獲特定異常
  2. 不要生吞異常!!!

參考自https://blog.csdn.net/ScarlettWen/article/details/81413366