Day13 異常機制.
簡單分類:
-
檢查性異常:最具代表檢查性異常是使用者錯誤或問題引起的異常,這是程式設計師無法預見的。例如開啟一個不存在的檔案時,一個異常就發生了,這些異常在編譯時不能簡單地忽略。
-
執行時異常:執行時異常是可能被程式設計師避免的異常。與檢查性相反,執行時異常可以在編譯時被忽略。
-
錯誤(ERROR):錯誤不是異常,而是脫離程式設計師控制的問題。錯誤通常在程式碼中容易被忽略。例如:當棧溢位時,一個錯誤就發生了,它們在編譯也檢查不到。
異常體結構
Error
-
Error類物件由Java虛擬機器生成並丟擲,大多數錯誤與程式碼編寫者所執行的操作無關。
-
Java虛擬機器執行錯誤(Virtual MachineError),當JVM不再有繼續執行操作所需的記憶體資源時,將出現OutOFMemoryError。這下一場發生時,Java虛擬機器(JVM)一般會選擇執行緒終止;
-
還有發生在虛擬機器試圖執行應用時,如類定義錯誤(NoClassDefFoundError)、連線錯誤(LinkageError).這些錯誤是不可查的,因為它們在應用程式的控制和處理能力之外,而且絕大多數是程式執行時不允許出現的狀況。
Exception
-
在Exception分支中有一個重要的子類RuntimeException(執行時異常)
-
ArraylndexOutOfBoundsException (陣列下標越界)
-
NullPointerException (空指標異常)
-
ArithmeticExeception (算術異常)
-
MissingResourceException (丟失資源)
-
ClassNotFoundException(找不到類)等異常, 這些異常是不檢查異常,程式中可以選擇捕獲處理,也可以不處理
-
-
這些異常一般是由程式邏輯錯誤引起的,程式應該從邏輯角度儘可能避免這類異常的發生;
-
Error和Exception的區別:error通常是災難性的致命的錯誤,是程式無法控制和處理的,當出現這些異常時,JVM一般會選擇終止執行緒;Exception通常情況下是可以被程式處理的,並且在程式中應該金肯的去處理這些異常。
異常處理機制
-
處理異常5個關鍵字:
try、catch、finally、throw、throws
-
捕獲異常:
-
丟擲異常:
關於throw和throws區別:
-
區別1:throw跟在方法聲明後,後面跟的是異常類名, 而throws用在方法體內,後面跟的是異常物件名。
-
區別2:throw只能丟擲一個異常物件名,而throws可以丟擲多個異常類名,用逗號隔開。
-
區別3:throw表示丟擲異常,由該方法體內的語句來處理,而throws表示丟擲異常,由該方法的呼叫者來處理。
-
區別4:throw丟擲了異常,執行throw一定出現某種異常,而throws表示出現異常的可能性,並不一定出現這種異常。
自定義異常
-
使用Java內建的異常類可以描述在程式設計時出現的大部分異常情況。除此之外,使用者還可以自定義異常。使用者自定義異常類,只需繼承Exception類即可。
-
在程式中使用自定義異常類,大體可分為以下幾個步驟:
1.建立自定義異常類。
2.在方法中通過throw關鍵字丟擲異常物件。
3.如果在當前拋異常的方法中處理異常,可以使用try-catch語句捕獲並處理;否則在方法的宣告處通過throws關鍵字指明要丟擲給方法呼叫者的異常,繼續進行下一步操作。
4.再出現異常方法的呼叫思考中捕獲並處理異常。
實際應用中的經驗總結!!
-
處理執行時異常時,採用邏輯去合理規避同時輔助 try-catch處理.
-
在多重catch塊後面,可以加上一個catch(Exception)來處理可能被遺漏的異常.
-
對於不確定的程式碼,也可以加上try-catch,處理潛在的異常.
-
儘量去處理異常,切忌只是簡單地呼叫printStackTraca()去列印輸出.
-
具體如何處理異常,要根據不同的業務需求和異常型別去決定.
-
儘量新增finally語句塊去釋放佔用的資源. IO~ Scanner~