Java基礎第十五天--Exception異常
阿新 • • 發佈:2019-01-06
2. JVM是如何處理異常的?
如果程式有異常,JVM預設的處理方式是把異常的名稱,原因及異常的位置等資訊
顯示在控制檯上
注意:如果JVM採用預設的處理方案,遇到異常,會退出JVM,它不會繼續向下執行
所以,我們要學習自己的處理方式
處理異常,不是讓你把異常隱藏,而是編寫處理方案
3. 自己處理異常
1)自己編寫程式碼處理
格式:
try{
可能會出問題的程式碼;
}catch(異常物件){ //異常物件--異常類名 變數名
對問題的處理;
}finally{
釋放資源;
}
2)把異常丟擲Throw
4. 異常物件要掌握的方法
1)toString()
public String toString() -- 返回此throwable的簡短描述
類的全路徑名稱:本地訊息描述
2)public String getMessage()-- 返回此throwable的詳細訊息字串
3)public void printStackTrace() -- 列印異常的資訊
注意:標準解決方案
try{}
catch(異常物件){
物件.printStackTrace();
}
它和jvm預設處理方案顯示的資訊是一致的,但是,自己處理後,
程式碼還可以繼續向下執行
5. 多個異常的處理方法
很多時候,我們可能無法去判斷哪裡出問題了?怎麼辦?
把所有程式碼全部放到try裡面?--不推薦
推薦--儘可能把少的程式碼放到try裡面
1)針對每一個問題,給出對應的處理方案
2)把多個處理放到一個地方,也就是一個try對應多個catch
注意:如果多個子異常,你不知道怎麼接收,就用父類Exception接收,不過不推薦
推薦--知道是哪個異常類,就用那個來接收
處理過程中的問題:
a)一旦在try裡面的某個地方發生了問題,就會從這裡結束。直接到catch裡面去
b)在使用多個catch的時候,如果有子父關係,父一定要放在最後一個catch裡面
如果沒有子父關係,這多個catch可以任意放置
在JDK7以後,出現了一個新的處理方案,針對多個異常是平級的關係:
catch(ExceptionA|ExceptionB|ExceptionC ... e){}
6. finally:用於釋放資源。finally裡面的程式碼肯定會被執行
注意:如果在執行到finally之前,JVM退出了,finally肯定不會執行
面試題1:final, finally, finalize的特點及區別
1)final是一個修飾符,可以修飾類,修飾方法,修飾變數
它修飾的類不能被繼承,修飾的方法不能被重寫,修飾的變數是常量
2)finally是異常處理的一部分
3)finalize()是Object類的方法,用於垃圾回收
面試題2:在catch裡面有一個return語句,請問finally裡面的內容還會被執行嗎?
如果會,請問是在return前,還是後?
會被執行;catch裡面的return會形成一條返回路徑,但是,它發現還有finally,
所以會去執行finally,之後繼續執行catch中的return返回路徑
-- finally僅僅是為了釋放資源,而不改變結果
7. 對異常丟擲--Throws
在宣告方法的時候,就相當於告訴別人,我的方法有異常,我沒有處理,丟擲來了
格式:方法小括號後面寫:throws 異常類名
注意:這個時候,呼叫該方法者應該來處理這個問題 try-catch方法
面試題3:throws和throw的區別?
throws:在方法宣告上,後面跟的是異常類名
throws聲明後面如果跟的是一個編譯期異常,呼叫者是必須處理的
throw:在方法體中,後面跟的是異常物件名
throw後面如果丟擲的是編譯時期異常物件,那麼,一般在方法宣告上使用throws的
8. 所有的RuntimeException的異常不需要處理,因為它需要你修正程式碼的引數或者邏輯
我們講解的兩種異常處理方案是針對非RuntimeException的Exception
處理原則是:
1)能自己處理的就自己處理
2)在main方法中儘量不要丟擲異常
3)將來在實際開發中,我們會把不同的異常給出不同的介面進行顯示
9. 自定義異常
自己定義的類應該去繼承java提供的異常類RuntimeException(執行期異常)或者Exception(異常父類,可用來代表編譯器異常)
10. 子父關係中的異常處理 子類重寫方法中不能丟擲比父類還要大的異常
如果程式有異常,JVM預設的處理方式是把異常的名稱,原因及異常的位置等資訊
顯示在控制檯上
注意:如果JVM採用預設的處理方案,遇到異常,會退出JVM,它不會繼續向下執行
所以,我們要學習自己的處理方式
處理異常,不是讓你把異常隱藏,而是編寫處理方案
3. 自己處理異常
1)自己編寫程式碼處理
格式:
try{
可能會出問題的程式碼;
}catch(異常物件){ //異常物件--異常類名 變數名
對問題的處理;
}finally{
釋放資源;
}
2)把異常丟擲Throw
4. 異常物件要掌握的方法
1)toString()
public String toString() -- 返回此throwable的簡短描述
類的全路徑名稱:本地訊息描述
2)public String getMessage()-- 返回此throwable的詳細訊息字串
3)public void printStackTrace() -- 列印異常的資訊
注意:標準解決方案
try{}
catch(異常物件){
物件.printStackTrace();
}
它和jvm預設處理方案顯示的資訊是一致的,但是,自己處理後,
程式碼還可以繼續向下執行
5. 多個異常的處理方法
很多時候,我們可能無法去判斷哪裡出問題了?怎麼辦?
把所有程式碼全部放到try裡面?--不推薦
推薦--儘可能把少的程式碼放到try裡面
1)針對每一個問題,給出對應的處理方案
2)把多個處理放到一個地方,也就是一個try對應多個catch
注意:如果多個子異常,你不知道怎麼接收,就用父類Exception接收,不過不推薦
推薦--知道是哪個異常類,就用那個來接收
處理過程中的問題:
a)一旦在try裡面的某個地方發生了問題,就會從這裡結束。直接到catch裡面去
b)在使用多個catch的時候,如果有子父關係,父一定要放在最後一個catch裡面
如果沒有子父關係,這多個catch可以任意放置
在JDK7以後,出現了一個新的處理方案,針對多個異常是平級的關係:
catch(ExceptionA|ExceptionB|ExceptionC ... e){}
6. finally:用於釋放資源。finally裡面的程式碼肯定會被執行
注意:如果在執行到finally之前,JVM退出了,finally肯定不會執行
面試題1:final, finally, finalize的特點及區別
1)final是一個修飾符,可以修飾類,修飾方法,修飾變數
它修飾的類不能被繼承,修飾的方法不能被重寫,修飾的變數是常量
2)finally是異常處理的一部分
3)finalize()是Object類的方法,用於垃圾回收
面試題2:在catch裡面有一個return語句,請問finally裡面的內容還會被執行嗎?
如果會,請問是在return前,還是後?
會被執行;catch裡面的return會形成一條返回路徑,但是,它發現還有finally,
所以會去執行finally,之後繼續執行catch中的return返回路徑
-- finally僅僅是為了釋放資源,而不改變結果
7. 對異常丟擲--Throws
在宣告方法的時候,就相當於告訴別人,我的方法有異常,我沒有處理,丟擲來了
格式:方法小括號後面寫:throws 異常類名
注意:這個時候,呼叫該方法者應該來處理這個問題 try-catch方法
面試題3:throws和throw的區別?
throws:在方法宣告上,後面跟的是異常類名
throws聲明後面如果跟的是一個編譯期異常,呼叫者是必須處理的
throw:在方法體中,後面跟的是異常物件名
throw後面如果丟擲的是編譯時期異常物件,那麼,一般在方法宣告上使用throws的
8. 所有的RuntimeException的異常不需要處理,因為它需要你修正程式碼的引數或者邏輯
我們講解的兩種異常處理方案是針對非RuntimeException的Exception
處理原則是:
1)能自己處理的就自己處理
2)在main方法中儘量不要丟擲異常
3)將來在實際開發中,我們會把不同的異常給出不同的介面進行顯示
9. 自定義異常
自己定義的類應該去繼承java提供的異常類RuntimeException(執行期異常)或者Exception(異常父類,可用來代表編譯器異常)
10. 子父關係中的異常處理 子類重寫方法中不能丟擲比父類還要大的異常