2.異常php
5.處理異常機制深刻理解git
6.異常總結github
1.1 什麼是異常?面試
1.2 finally必定會執行嗎數據庫
2.1 異常的概述和分類編程
C:異常的繼承體系segmentfault
非嚴重問題: Exception數組
2.2 JVM默認是如何處理異常的【理解】markdown
JVM默認是如何處理異常的jvm
main函數收到這個問題時,有兩種處理方式:
2.3 異常處理的兩種方式
2.4 try...catch的方式處理異常【掌握】
try { 可能出現問題的代碼 ; }catch(異常名 變量名){ 針對問題的處理 ; }finally{ 釋放資源; }
注意事項:
c:處理多個異常
2.5 編譯期異常和運行期異常的區別【理解】
Java中的異常被分爲兩大類:編譯時異常和運行時異常。
2.6 throw的概述以及和throws的區別【掌握】
a:throws
static void pop() throws NegativeArraySizeException { // 定義方法並拋出NegativeArraySizeException異常 int[] arr = new int[-3]; // 建立數組 } public static void main(String[] args) { // 主方法 try { // try語句處理異常信息 pop(); // 調用pop()方法 } catch (NegativeArraySizeException e) { System.out.println("pop()方法拋出的異常");// 輸出異常信息 } } 使用throws關鍵字將異常拋給調用者後,若是調用者不想處理該異常,能夠繼續向上拋出,但最終要有可以處理該異常的調用者。 pop方法沒有處理異常NegativeArraySizeException,而是由main函數來處理。
b:throw
public PlayService getPlayService() { PlayService playService = BaseAppHelper.get().getPlayService(); if (playService == null) { //待解決:當長期處於後臺,如何保活?避免service被殺死…… throw new NullPointerException("play service is null"); } return playService; }
2.7 異常的注意事項及如何使用異常處理【瞭解】
A:異常注意事項(針對編譯期異常)
B:如何使用異常處理
區別:
注意:catch關鍵字後面括號中的Exception類型的參數e。Exception就是try代碼塊傳遞給catch代碼塊的變量類型,e就是變量名。catch代碼塊中語句"e.getMessage();"用於輸出錯誤性質。一般異常處理經常使用3個函數來獲取異常的有關信息:
Exception 這種異常分兩大類運行時異常和非運行時異常(編譯異常)。程序中應當儘量去處理這些異常。
Java的異常(包括Exception和Error)分爲可查的異常(checked exceptions)和不可查的異常(unchecked exceptions)。
處理運行時異常
處理Error
處理可查異常
try 塊:用於捕獲異常。其後可接零個或多個catch塊,若是沒有catch塊,則必須跟一個finally塊。 catch 塊:用於處理try捕獲到的異常。 finally 塊:不管是否捕獲或處理異常,finally塊裏的語句都會被執行。當在try塊或catch塊中遇到return語句時,finally語句塊將在方法返回以前被執行。在如下4種特殊狀況下,finally塊不會被執行: 1)在finally語句塊中發生了異常。 2)在前面的代碼中用了System.exit()退出程序。 3)程序所在的線程死亡。 4)關閉CPU。
1) 必須在 try 以後添加 catch 或 finally 塊。try 塊後可同時接 catch 和 finally 塊,但至少有一個塊。 2) 必須遵循塊順序:若代碼同時使用 catch 和 finally 塊,則必須將 catch 塊放在 try 塊以後。 3) catch 塊與相應的異常類的類型相關。 4) 一個 try 塊可能有多個 catch 塊。若如此,則執行第一個匹配塊。即Java虛擬機會把實際拋出的異常對象依次和各個catch代碼塊聲明的異常類型匹配,若是異常對象爲某個異常類型或其子類的實例,就執行這個catch代碼塊,不會再執行其餘的 catch代碼塊 5) 可嵌套 try-catch-finally 結構。 6) 在 try-catch-finally 結構中,可從新拋出異常。 7) 除了下列狀況,總將執行 finally 作爲結束:JVM 過早終止(調用 System.exit(int));在 finally 塊中拋出一個未處理的異常;計算機斷電、失火、或遭遇病毒攻擊。
1)當try沒有捕獲到異常時:try語句塊中的語句逐一被執行,程序將跳過catch語句塊,執行finally語句塊和其後的語句; 2)當try捕獲到異常,catch語句塊裏沒有處理此異常的狀況:當try語句塊裏的某條語句出現異常時,而沒有處理此異常的catch語句塊時,此異常將會拋給JVM處理,finally語句塊裏的語句仍是會被執行,但finally語句塊後的語句不會被執行; 3)當try捕獲到異常,catch語句塊裏有處理此異常的狀況:在try語句塊中是按照順序來執行的,當執行到某一條語句出現異常時,程序將跳到catch語句塊,並與catch語句塊逐一匹配,找到與之對應的處理程序,其餘的catch語句塊將不會被執行,而try語句塊中,出現異常以後的語句也不會被執行,catch語句塊執行完後,執行finally語句塊裏的語句,最後執行finally語句塊後的語句;
1) 若是是不可查異常(unchecked exception),即Error、RuntimeException或它們的子類,那麼能夠不使用throws關鍵字來聲明要拋出的異常,編譯仍能順利經過,但在運行時會被系統拋出。 2)必須聲明方法可拋出的任何可查異常(checked exception)。即若是一個方法可能出現受可查異常,要麼用try-catch語句捕獲,要麼用throws子句聲明將它拋出,不然會致使編譯錯誤 3)僅當拋出了異常,該方法的調用者才必須處理或者從新拋出該異常。當方法的調用者無力處理該異常的時候,應該繼續拋出,而不是囫圇吞棗。 4)調用方法必須遵循任何可查異常的處理和聲明規則。若覆蓋一個方法,則不能聲明與覆蓋方法不一樣的異常。聲明的任何異常必須是被覆蓋方法所聲明異常的同類或子類。
在程序中使用自定義異常類,大致可分爲如下幾個步驟。