1. 程式人生 > >Java檢查異常和非檢查異常區別

Java檢查異常和非檢查異常區別

public class ExceptionTypeTest {
public void doSomething() throws ArithmeticException{
System.out.println();
}
public static void main(){
ExceptionTypeTest ett = new ExceptionTypeTest();
ett.doSomething();
}
}


問題1:上面的程式能否編譯通過?並說明理由。

解答:能編譯通過。分析:按照一般常理,定義doSomething方法是定義了ArithmeticException異常,在main方法裡面呼叫了該方法。那麼應當繼續丟擲或者捕獲一下。但是ArithmeticException異常是繼承RuntimeException執行時異常。 

Java裡面異常分為兩大類:checkedexception(檢查異常)和unchecked exception(未檢查異常),對於未檢查異常也叫RuntimeException(執行時異常),對於執行時異常,java編譯器不要求你一定要把它捕獲或者一定要繼續丟擲,但是對checkedexception(檢查異常)要求你必須要在方法裡面或者捕獲或者繼續丟擲

問題2:上面的程式將ArithmeticException改為IOException能否編譯通過?並說明理由。
解答:不能編譯通過。分析:IOException extends Exception 是屬於checked exception,必須進行處理,或者必須捕獲或者必須丟擲。

總結:java中異常分為兩類:checked exception(檢查異常)和unchecked exception(未檢查異常),對於未檢查異常也叫RuntimeException(執行時異常).
對未檢查的異常(unchecked exception )的幾種處理方式:
1、捕獲
2、繼續丟擲
3、不處理
對檢查的異常(checked exception,除了RuntimeException,其他的異常都是checked exception )的幾種處理方式:
1、繼續丟擲,消極的方法,一直可以拋到java虛擬機器來處理
2、用try...catch捕獲

注意,對於檢查的異常必須處理,或者必須捕獲或者必須丟擲


1.異常:程式再執行期間發生的不正常事件,它會打斷指令的正常流程。
異常都是發生在程式的執行期,編譯出現的問題叫語法錯誤。
1)當程式再執行過程中出現了異常,JVM自動建立一個該型別的異常物件。同時把這個異常物件交給執行時系統。(丟擲異常)
2)執行時系統接受到一個異常物件時,它會在產生異常的程式碼附近查詢相應的處理方式。
3)異常的處理方式有兩種:
1.捕獲並處理:在異常的程式碼附近顯式用try/catch進行處理(不合理),執行時系統捕獲後會查詢相應的catch處理塊,再catch處理塊中對該異常進行處理。
2.檢視發生異常的方法是否有向上宣告異常,有向上宣告,向上級查詢處理語句,如果沒有向上宣告,JVM中斷程式的執行並處理。用throws向外宣告(合理的處理方法)

java.lang.Throwable
|-- Error錯誤:JVM內部的嚴重問題。無法恢復。程式人員不用處理。
|--Exception異常:普通的問題。通過合理的處理,程式還可以回到正常執行流程。要求程式設計人員要進行處理。
|--RuntimeException:也叫非受檢異常(unchecked exception).這類異常是程式設計人員的邏輯問題。應該承擔責任。Java編譯器不進行強制要求處理。 也就是說,這類異常在程式中,可以進行處理,也可以不處理。
|--非RuntimeException:也叫受檢異常(checked exception).這類異常是由一些外部的偶然因素所引起的。Java編譯器強制要求處理。也就是說,程式必須進行對這類異常進行處理。
1)非受檢的:NullPointerException,ClassCastException,ArrayIndexsOutOfBoundsException,ArithmeticException(算術異常,除0溢位)
2)受檢:Exception,FileNotFoundException,IOException,SQLException.
5.異常處理的兩種方式:
1).顯示用try/catch進行處理(不合理)

try{
//可能會出現異常的程式碼段;
}catch(異常型別1 變數名){ //處理指定型別的異常
//對該型別異常的處理程式碼段;
e.printStackTrace();
}catch(){
}[finally{
//無論是否發生異常都要執行的程式碼段;
//經常用來清理資源
}]


2).向上宣告:用throws關鍵字,向外宣告(合理的處理方法)
宣告本方法可能會丟擲的異常列表。
...方法名(引數列表) throws 異常型別1,異常型別2
向上宣告是告訴本方法的呼叫者,在使用本方法時,應該對這些異常進行處理。

6.手動丟擲一個異常:當程式邏輯不符合期望時,要中止後面程式碼的執行時。
在方法的程式碼段中,可以使用throw關鍵字手動丟擲一個異常。
注意:如果手動丟擲的是受檢異常,那麼本方法必須進行處理(應該採用向上宣告這個異常);如果手動丟擲的是非受檢異常,那麼可以進行處理,也可以不處理。
可以繼承Exception來定義一個受檢異常。也可以繼承自RuntimeException或其子類來定義一個非受檢異常。8.異常概括:一個圖兩種處理方式.
觀察丟擲的異常的名字和行號很重要。
應該捕獲和處理那些已知如何處理的異常,傳遞那些不知如何處理的異常。
儘量減少try語句塊的體積。

for(int i=1;i<=1000;i++){
try{
...
}catch(...)
}不合理
儘量減少try-catch語句的巢狀

在catch塊程式碼段中,應該列印除該異常的堆疊跟蹤資訊以方便除錯。
throws可以宣告方法可能會丟擲一個或多個異常,異常之間用','隔開
如果宣告的可能會丟擲的異常是非受檢的,該方法的呼叫者可以處理也可以不處理。
如果宣告的可能會丟擲的異常是受檢的,該方法的呼叫者必須進行處理。
如果手動丟擲的異常是一個受檢異常,那麼必須進行處理
處理方式有兩種:
1.顯示用try/catch進行處理(不合理)
2.用throws向外宣告(合理的處理方法)

*****************************************************************************************************************

異常處理(Exception)

2.異常的處理機制:

3.異常的分類:

4.常見異常:

7.自定義異常:當需要一些跟特定業務相關的異常資訊類時。

9.異常實踐:

使用 throws關鍵字來宣告方法可能會丟擲的異常

用throw關鍵字來手動丟擲一個異常,

應捕獲和處理那些已知如何處理的異常,而傳遞那些不知如何處理的異常。