java基礎篇——異常處理
異常
1、概述
程式有可能出現問題,我們把出現的問題就稱為異常.
2、主函式處理異常的方式:
A:主函式手動處理方式的方式.(異常處理機制)
B:採用的是jvm的預設處理機制.
把異常的資訊列印輸出到控制檯.
3、異常的體系結構
A:Throwable 異常的超類
Error:
我們不可解決的問題。面對此種問題,我們無能為力。
比如說:類不存在或者記憶體溢位。
Exception:
在執行時執行出現的一些不正常的狀況,這個狀況我們通過修改程式碼,是可以解決的。
舉例:騎自行車回家。
走不好的路,車爆胎,是異常。
發洪水,路給沖斷了,是錯誤。
2020年,疫情這個東西來了,就是錯誤。
頭疼,感冒了。是異常。
B:通過分析,發現我們要學習異常。
4、異常的處理方式
A:try...catch...finally
**基本格式
try{
//有可能出現異常的程式碼
}catch(異常類 名字){
//處理異常的程式碼
}finally{
//一定會被執行的程式碼,如釋放資源
}
**變形格式
try...catch
try...catch...catch...catch...
try...finally
try...catch...finally
try...catch...catch...finally
**finally的特點
它永遠都會被執行.
有一個特殊情況:如果在程式碼中jvm退出系統而來,那麼finally
**面試題
***final,finally,finalize區別?
final用於宣告屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。 內部類要訪問區域性變數,區域性變數必須定義成final型別,例如,一段程式碼……
finally是異常處理語句結構的一部分,表示總是執行。
finalize是Object類的一個方法,在垃圾收集器執行的時候會呼叫被回收物件的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉檔案等。JVM不保證此方法總被呼叫
***
try{
System.out.println("aaa");
System.out.println(10/0);//ArithmeticException
}catch(Exception e){
System.out.println("bbb");
return;
}finally{
System.out.println("ccc");
}
請問這個程式執行結果?
aaa
bbb
ccc
B:throws,throw 丟擲
區別:------一旦執行throw語句,就結束功能!
**使用位置
throws在方法的宣告上使用
throw在方法體內使用
**使用格式
throws後面跟的使用異常的類名
throw後面跟的是物件.格式:throw new 異常類名(引數);
**聯絡
有throws不一定有throw
有throw一定有throws
C:兩種處理方式用哪種呢?<何時使用try,何時使用throw呢?>
**自己能夠處理的就自己處理.
**自己實在處理不了的交給呼叫者.
5、Exception的分類
A:Exception
這種型別的異常,如果丟擲,在編譯的時候就會檢查.此類異常需要編寫針對性的處 理程式碼進行處理。
B:RuntimeException
這種型別的異常,如果丟擲,在編譯的時候不檢查,執行的時候直接處理.
這種異常必須通過修改程式碼才能解決.所以,一般針對這種異常,我們不處理,jvm處 理。
6、自定義異常
除數不能為負數.
1:繼承自Exception或者RuntimeException.必須的!
2:在自定義異常裡面,提供一個帶參構造
1 class MyException extends Exception{ 2 3 MyException(){} 4 5 MyExcepiton(String message){ 6 7 super(message); 8 9 } 10 11 } 12 13 class Demo{ 14 15 int div(int a,int b)throws RuntimeException{ 16 17 if(b<0){ 18 19 throw new MyException("除數不能為負數!"); 20 21 } 22 23 } 24 25 }
7、異常使用細節
A:我們為什麼要使用try…catch語句進行異常處理呢?只有在某個功能上可能出現某種隱患,並且在該功能的宣告上進行了描述時,我們才能夠使用此種針對性的處理方式。
B:如果一個功能丟擲多個異常,那麼在呼叫該功能時,需要有多個catch進行每一個異常的針對性處理,如果多個catch中有父類異常,一定要定義在最下面,否則編譯失敗。
C:函式內丟擲異常,函式上一定要使用thows進行標識,呼叫者如果呼叫了該函式,就需要對其進行處理(try或者丟擲),否則編譯失敗。