[英]Checked and Unchecked Custom Exception
我感到困惑的行為CustomExceptions
下面program.If Line2
的評論和Line1
不是那么程序運作良好,但如果Line1
的評論和Line2
不那么編譯時錯誤當屬“為CustomChecked.This例外無法到達的catch塊不會從Line3的try語句主體中拋出”。請幫助我為什么此comple time異常僅用於unChecked Exception ?。
try
{
if(true)
{
throw new CustomChecked("Checked Exception");// Line1
// throw new CustomUnChecked("Un-Checked Exception");// Line2
}
}
catch(CustomChecked ex) //Line3
{
System.out.println(ex.getMessage());
}
catch(CustomUnChecked ex)
{
System.out.println(ex.getMessage());
}
例外情況:
class CustomChecked extends Exception
{
public CustomChecked(String msg) {
super(msg);
}
}
class CustomUnChecked extends RuntimeException
{
public CustomUnChecked(String msg) {
super(msg);
}
}
CustomUnChecked是一個RuntimeException
,它unchecked
意味着編譯器不檢查誰可以/可以throw
該exception
。 編譯器假定每個對象/方法/代碼塊都可以throw
任何類型的RuntimeException
,因此您始終可以在check
語句中檢查這種類型的異常。
另一方面,對CustomChecked進行了檢查,這意味着編譯器會檢查所有可能引發該錯誤的方法和代碼塊。 因此,只有在知道(在編譯時)知道調用了將異常拋出到try
塊內的方法/代碼時,您才能catch
已檢查的異常。
綜上所述-編譯器會通知您,不需要(第3行中的) catch
,因此應該刪除它,因為沒有人會在try語句內throw
CustomCheckedException 。 由於compiler
未checked
CustomUnCheckedException (它是運行時,假定會意外拋出),因此可以保留它的check
語句。
Java Spec中適用的部分是11.2.3 。 它讀
如果catch子句可以捕獲經過檢查的異常類E1,則是編譯時錯誤,並且與catch子句相對應的try塊不能拋出作為E1的子類或超類的經過檢查的異常類,除非E1是Exception或Exception的超類。
注意,此子句僅限於“檢查”異常。 根據“未檢查”的定義,未檢查的異常不會應用這些檢查。 因此,您看到的行為有所不同。
編譯器不會檢查您是否捕獲了RuntimeException,但會檢查您是否捕獲了異常。 這就是為什么如果嘗試捕獲不存在的已檢查異常(如果該異常不在throws子句中,則它不應該存在,因為它是一個已檢查的異常)而導致錯誤,並且如果您捕獲了RuntimeException(可能發生,則不會出錯)即使您沒有將它放在throws子句中,例如NullPointerException)。
簡而言之,CheckedExceptions必須在throws子句中聲明,並且必須被捕獲。 可以捕獲未經檢查的異常,但是編譯器無法知道if代碼是否拋出未經檢查的異常,因此,無論是否進行檢查,它都不會給您帶來錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.