- 列舉典型的異常
典型的錯誤Error:
方法遞歸調用,會發生棧內存溢出錯誤 StackOverflowError
當不斷得向堆中創建對象時,會出現OutOfMemoryError
Exception 異常
異常是可以捕捉住,然後讓程序恢復運行
Error和Exception有共同的父類 Throwable
-
如何處理異常
2.1 積極處理
try {
// 有可能出現異常的代碼
} catch( 異常類型 ) {
// 捕獲異常後的代碼
}- catch能捕捉的異常,要麼精確匹配,要麼用父類型匹配
- 可以用多個catch捕獲不同類型的異常
- 多個catch塊時,子類的catch塊要寫在前面,父類要寫在後面
- 1.7 後一個catch塊中可以有多個平級的異常
2.2. 消極處理
語法: 在方法的聲明部分添加 throws 異常類型
含義: 說明方法在執行時有可能出現的異常
將異常交給方法的調用者處理
main 的調用者是jvm,當異常傳給jvm時,程序運行就結束了 -
從異常的行爲分類:
未檢查異常(uncheck)
RuntimeException或它的子類
Error和它的子類
檢查異常(check)
Throwable
Exception以及他們的子類
檢查異常需要強制地配合try-catch或throws一起使用 -
主動拋出異常
throw new 異常對象(); // 只能是Exception或是Error的子類對象 -
異常對象的常見方法
e.getMessage() 獲取異常的信息
e.printStackTrace() 打印異常的跟蹤信息 -
異常的傳播
以方法調用的反方向進行傳播 -
自定義異常
1) 創建異常類
class MyException extends Exception{ // 檢查異常
}
class MyException extends RuntimeException { // 未檢查異常
} -
異常使用的經驗
1) 不要吞掉異常
2) 與有返回值的方法連用時要注意:public class Exception5 { public static int test(){ try { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int r = 1/n; return r; } catch (Exception e ) { System.out.println(e.getMessage()); return -1; // 解決方法1: 在catch也寫一個return返回結果 // throw e; // 解決方法2: 把異常重新拋出 } } public static void main(String[] args) { int r = test(); System.out.println(r); } }
3) 重寫方法與異常聲明(throws)
子類的重寫方法,不能拋出比父類更多的異常(檢查異常)
子類的重寫方法,可以不拋出異常
若父類和子類方法throws都是未檢查異常不用遵守上述約定4) 建議將檢查異常轉換爲未檢查異常重新拋出
-
finally
語法:try { ... } catch(Exception e) { } finally { // 無論出現異常與否,總會被執行的代碼 }
如果try catch 以及finally都出現了return語句, 以finally中的return爲準
如果try 有return, 但finally中對返回的變量做了修改, 不會影響return的結果