簡體   English   中英

當在try塊中寫出throw new Error()時為什么不執行catch塊。最后只進入.Latter代碼也未執行

[英]when throw new Error() is written in try block why catch block is not executed .it go in finally only .Latter code also not executed

下面是一個示例程序,該程序在try塊中調用了faultedCode()方法,因此,為什么只輸出只顯示帶有“ Exception in thread“ main” java.lang.Error“的C。

public class ExceptionTest {

    public static void defectedCode(){

        throw new Error();
    }

    public static void main(String args[]){

        try{
            defectedCode();
            System.out.println("A");

        }catch(Exception e){

            System.out.println("B");

        }finally{

            System.out.println("C");
        }
        System.out.print("D");
    }
}
Exception in thread "main" java.lang.Error

C

at ExceptionTest.defectedCode(ExceptionTest.java:15)

at ExceptionTest.main(ExceptionTest.java:21)

Java Result: 1

造成這種情況的主要原因是您拋出了一個錯誤,但是卻捕獲了一個異常。 如果您查看Throwable層次結構,這很清楚。 您無法捕獲帶有異常的錯誤。 因此,沒有輸入catch塊,最后將被調用。

嘗試這個:

    try{
        defectedCode();
        System.out.println("A");

    }catch(Throwable e){

        System.out.println("B");

    }finally{

        System.out.println("C");
    }

在此處輸入圖片說明

因為Error不是Exception ,所以catch塊沒有監視它

使用throw new Exception()

您不應該發現錯誤

錯誤“表示合理的應用程序不應嘗試捕獲的嚴重問題”。

異常“指示合理的應用程序可能想要捕獲的條件。”

在談論您的代碼時,您將引發一個錯誤並捕獲一個異常,到現在為止,它們已是2個離散實體,這已經很明顯了

錯誤以及RuntimeException及其子類都是未經檢查的異常。 所有其他異常類都是檢查的異常。

受檢查的異常通常是程序可以從中恢復的異常,最好以編程方式從此類異常中恢復。 示例包括FileNotFoundException,ParseException等。希望程序員使用try-catch塊檢查這些異常,或者將其扔回調用方。

另一方面,我們有未經檢查的異常。 如果一切井井有條,這些異常可能不會發生,但是它們確實會發生。 示例包括ArrayIndexOutOfBoundException,ClassCastException等。許多應用程序將對RuntimeException及其子類使用try-catch或throws子句,但從語言角度來看,不需要這樣做。 請注意,通常可以從RuntimeException恢復,但是設計類/異常的人認為最終程序員無需檢查此類異常。

錯誤也是未經檢查的異常,程序員無需對此進行任何操作。 實際上,對錯誤使用try-catch子句是一個壞主意。 通常,無法從錯誤中恢復,並且應允許程序終止。 示例包括OutOfMemoryError,StackOverflowError等。

請注意,盡管錯誤是未經檢查的異常,但我們不應該嘗試處理它們,但是可以在代碼中處理RuntimeExceptions(也包括未經檢查的異常)。 檢查的異常應由代碼處理。

Error不是Exception

可拋出對象的基類是Throwable
錯誤和異常是兩種不同類型的throwables。 但是,通常不應該捕獲錯誤,這就是為什么人們使用catch(Exception e)基本上捕獲應該捕獲的所有異常的原因。

顯然,由於Error不是Exception的子類,因此不受catch(Exception e) ,因此不會被捕獲。 無論是否已捕獲throwable,始終都會執行finally

盡管從倫理上講,您不應捕獲任何錯誤,但仍可以將其作為Throwable對象捕獲。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM