1. 程式人生 > 其它 >面試必問:Java 檢查異常和非檢查異常的區別?別理解錯了。。。

面試必問:Java 檢查異常和非檢查異常的區別?別理解錯了。。。

來源:www.iteye.com/blog/yangshen998-1311682

程式碼

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 )的幾種處理方式:

  • 捕獲
  • 繼續丟擲
  • 不處理

對檢查的異常(checked exception,除了RuntimeException,其他的異常都是checked exception )的幾種處理方式:

  • 繼續丟擲,消極的方法,一直可以拋到java虛擬機器來處理
  • 用try...catch捕獲

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

異常處理(Exception)

1.異常:

程式再執行期間發生的不正常事件,它會打斷指令的正常流程。異常都是發生在程式的執行期,編譯出現的問題叫語法錯誤。

2.異常的處理機制:

1)當程式再執行過程中出現了異常,JVM自動建立一個該型別的異常物件。同時把這個異常物件交給執行時系統。(丟擲異常)

2)執行時系統接受到一個異常物件時,它會再產生異常的程式碼附近查詢相應的處理方式。

3)異常的處理方式有兩種:

  1. 捕獲並處理:在異常的程式碼附近顯示用try/catch進行處理(不合理),執行時系統捕獲後會查詢相應的catch處理塊,再catch處理塊中對該異常進行處理。

  2. 檢視發生異常的方法是否有向上宣告異常,有向上宣告,向上級查詢處理語句,如果沒有向上宣告,JVM中斷程式的執行並處理。用throws向外宣告(合理的處理方法)

3.異常的分類:

  • java.lang.Throwable

    • Error錯誤:JVM內部的嚴重問題。無法恢復。程式人員不用處理。
    • Exception異常:普通的問題。通過合理的處理,程式還可以回到正常執行流程。要求程式設計人員要進行處理。
      • RuntimeException:也叫非受檢異常(unchecked exception).這類異常是程式設計人員的邏輯問題。應該承擔責任。Java編譯器不進行強制要求處理。也就是說,這類異常再程式中,可以進行處理,也可以不處理。

      • 非RuntimeException:也叫受檢異常(checked exception).這類異常是由一些外部的偶然因素所引起的。Java編譯器強制要求處理。也就是說,程式必須進行對這類異常進行處理。

4.常見異常:

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關鍵字手動丟擲一個異常。

注意:如果手動丟擲的是受檢異常,那麼本方法必須進行處理(應該採用向上宣告這個異常);如果手動丟擲的是非受檢異常,那麼可以進行處理,也可以不處理。

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

可以繼承繼承Exception來定義一個受檢異常。也可以繼承自RuntimeException或其子類來定義一個非受檢異常。

8.異常概括:

一個圖兩種處理方式.

9.異常實踐:

觀察丟擲的異常的名字和行號很重要。

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

儘量減少try語句塊的體積。

for(int i=1;i<=1000;i++){
try{
...
}catch(...)
}

不合理

儘量減少try-catch語句的巢狀。

在catch塊程式碼段中,應該列印除該異常的堆疊跟蹤資訊以方便除錯。

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

throws可以宣告方法可能會丟擲一個或多個異常,異常之間用','隔開

  • 如果宣告的可能會丟擲的異常是非受檢的,該方法的呼叫者可以處理也可以不處理。

  • 如果宣告的可能會丟擲的異常是受檢的,該方法的呼叫者必須進行處理。

用throw關鍵字來手動丟擲一個異常,如果手動丟擲的異常是一個受檢異常,那麼必須進行處理

處理方式有兩種:

  1. 顯示用try/catch進行處理(不合理)

  2. 用throws向外宣告(合理的處理方法)

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

近期熱文推薦:

1.1,000+ 道 Java面試題及答案整理(2022最新版)

2.勁爆!Java 協程要來了。。。

3.Spring Boot 2.x 教程,太全了!

4.別再寫滿屏的爆爆爆炸類了,試試裝飾器模式,這才是優雅的方式!!

5.《Java開發手冊(嵩山版)》最新發布,速速下載!

覺得不錯,別忘了隨手點贊+轉發哦!