[英]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.