簡體   English   中英

Java中未報告的異常處理

[英]unreported exception handling in java

我是Java初學者,並且知道try...catch語句用於處理異常。 表示當try塊引發異常時,將執行catch塊。 所以,我的問題是,當我嘗試以下代碼(不使用try catch )時,它在read()方法中引發了未報告的IOException ,但是當我使用try catch它可以正常工作。

try塊中發生上述異常並打印出exception occured異常時,為什么控件沒有轉移到catch語句? 這是我的代碼:

class Test00 {
    public static void main(String args[]) {
        char ch;

        try {
            ch=(char)System.in.read();//here exception is thrown without using try..catch
            System.out.println(ch);
        } catch(Exception e) {
            System.out.print("exception occured");
        }
    }
}

我認為編譯器在說要拋出異常,這就是為什么代碼可以使用try catch的原因。但是為什么不執行catch塊呢?是我做錯了什么。

編譯器告訴您可能會引發異常,並且您必須滿足這種可能性。

編譯器正在對您的代碼進行靜態分析。 它無法告訴您代碼實際上將如何實際運行。

這可能令人沮喪。 例如,如果我寫:

new URL("http://www.stackoverflow.com");

編譯器將堅持要求我捕獲MalformedURLException 顯然,URL很好,但是編譯器警告我,因為我可以使用以下方法構造URL對象:

new URL(potentiallyDubiousUserInput);

而且我不能保證該字符串potentiallyDubiousUserInput是DubiousUserInput。

這些被稱為檢查異常,您必須處理它們(捕獲或聲明它們被進一步拋出)。 它們可能會很痛苦,您會在諸如Scala之類的語言中看到未檢查所有異常。 也就是說,您不必明確地處理它們。

有關更多信息,請參見此問題/答案

您必須在編譯器告訴您的內容和運行時發生的情況之間進行區分(並清楚地告訴我們,以便我們不必為之困惑)。

在您的情況下,如果沒有try-catch,編譯器會告訴您read() 可能會拋出,並且您必須以某種方式處理該異常。 這就是通過添加try-catch所做的。

但是,當您隨后運行該程序時,它實際上並沒有拋出(通常來說,該程序不太可能拋出),因此它從未進入catch塊。

這是因為System.in.read()可能引發IOException,這是一個已檢查的Exception。 就像在JLS 11.2.3中提到的關於檢查的異常:

如果方法或構造函數主體可以拋出某些異常類E(當E為檢查的異常類,並且E不是方法或構造函數的throws子句中聲明的某個類的子類),則這是編譯時錯誤。

暫無
暫無

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

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