基本概念
1. 所有的異常都是從Throwable繼承而來的缰雇,是所有異常的共同祖先渗柿。
2. Throwable有兩個(gè)子類,Error和Exception。
Error
Error是錯(cuò)誤辰如,通常包括以下兩類:
- 編譯期的所有錯(cuò)誤
類定義錯(cuò)誤、少分號(hào)贵试、符號(hào)錯(cuò)誤等等
- 虛擬機(jī)自身錯(cuò)誤(如上圖)
內(nèi)存溢出(遞歸)
Error表示的是程序自身無法處理的異常
什么叫程序自身無法處理琉兜?
對(duì)比Exception,是可以try catch捕獲的毙玻,而error不可以
Exception
Exception是程序可以處理的異常豌蟋,通過try catch語(yǔ)句塊可以將出現(xiàn)的異常捕獲,然后進(jìn)行相應(yīng)的處理桑滩。
Exception通常分為Runtime Exception和IO Exception梧疲,而所有的error和Runtime Exception都是unchecked exception
也就是說error和runtime exception是不必檢查的異常,這個(gè)檢查是指編譯期,比如:
- 數(shù)組越界
- 除數(shù)為0
- 類為定義
這些異常在編譯期是檢查不出來的幌氮,只有運(yùn)行的時(shí)候才能出現(xiàn)缭受。
而另一方面,IOException被稱為checked Exception该互。
可以注意到每次我們?cè)趯懳募鞯拇a時(shí)米者,編輯器都會(huì)提示出這里可能出現(xiàn)FileNotFoundException,這就是編譯期可預(yù)測(cè)的異常宇智。
異常的處理
1. try-catch
try{
//需要執(zhí)行的代碼
}catch(Exception e){
//需要處理的異常
}
這里注意用了向上轉(zhuǎn)型的概念蔓搞,所有的Runtime Exception都繼承于Excepition,當(dāng)輸出的時(shí)候則由編譯期判斷出具體的類型
2. throw/throws
如果用try-catch對(duì)異常捕獲處理随橘,也可以用throw/throws關(guān)鍵字將異常拋給上層方法處理喂分,throw用于在方法內(nèi)拋出異常,而throws用于方法名后聲明可能拋出的異常類型机蔗,如下:
import java.io.*;
public class className
{
public void deposit(double amount) throws RemoteException
{
// Method implementation
throw new RemoteException();
}
//Remainder of class definition
}
3. finally關(guān)鍵字
finally 關(guān)鍵字用來創(chuàng)建在 try 代碼塊后面執(zhí)行的代碼塊妻顶。
無論是否發(fā)生異常,finally 代碼塊中的代碼總會(huì)被執(zhí)行蜒车。
try{
// 程序代碼
}catch(異常類型1 異常的變量名1){
// 程序代碼
}catch(異常類型2 異常的變量名2){
// 程序代碼
}finally{
// 程序代碼
}
finally和return 的執(zhí)行順序
考慮到try-catch中的return讳嘱,finally的執(zhí)行發(fā)生在return執(zhí)行之后返回之前,也就是說先執(zhí)行return 后面的指令酿愧,再執(zhí)行return沥潭。可以用debug試出來嬉挡,如上圖钝鸽。