簡體   English   中英

已檢查和未檢查的自定義異常

[英]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意味着編譯器不檢查誰可以/可以throwexception 編譯器假定每個對象/方法/代碼塊都可以throw任何類型的RuntimeException ,因此您始終可以在check語句中檢查這種類型的異常。

另一方面,對CustomChecked進行了檢查,這意味着編譯器會檢查所有可能引發該錯誤的方法和代碼塊。 因此,只有在知道(在編譯時)知道調用了將異常拋出到try塊內的方法/代碼時,您才能catch已檢查的異常。

綜上所述-編譯器會通知您,不需要(第3行中的) catch ,因此應該刪除它,因為沒有人會在try語句內throw CustomCheckedException 由於compilerchecked 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.

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