簡體   English   中英

使用main方法的檢查異常處理

[英]Handling with the checked exception from main method

public class s1 {

    void m1(){
        m2();
    }

    String m2() throws IOException{
        BufferedReader inputFile = new BufferedReader(new FileReader("a.txt"));
        String line = inputFile.readLine();
        inputFile.close();
        return line;
    }
}


public class Main {
    public static void main(String[] args) {
        s1 obj1 = new s1();
        try {
            obj1.m1();
        }
        catch (Exception e){
            System.out.println("I got it!");
        }
    }
}

當我運行此代碼時,我得到了

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
Unhandled exception type IOException

我對該消息感到困惑,因為我認為我是在main方法中使用此檢查的IOException處理的。然而,編譯器也希望我向void m1()添加throws 。這的主要原因是什么?

m1調用的方法m2引發異常。 因此,您應該:

向方法m1中添加throws IOException

要么

在try塊中調用方法m2

因為必須對m2拋出的異常進行處理,所以無論是被捕獲還是再次拋出。

您的方法m1調用另一個引發異常的方法m2 ,因此m1必須引發異常,這就是Java的設計方式。

如果在方法m2使用了try/catch來捕獲該異常,則無需向其添加throws 因此,如果您不想向m2和所有調用m2添加throws IOException -請在此方法中立即捕獲它。

編譯器也希望我向空m1()添加拋出。 主要原因是什么?

異常處理有兩個主要方面,即報告恢復 在Java中,異常處理提供了一種靈活的機制,用於將控制從錯誤報告的角度傳遞到補碼恢復處理程序。

throws子句向您的方法的調用者發出信號,告知它可能遇到IOException 然后,調用者需要做出相同的決定,處理異常或告訴其調用者可能引發了異常。

簡而言之,如果某個方法正在使用throws子句,那么它將隱式告訴其他方法–“如果調用我,則必須處理我拋出的這些異常”。

方法m2可能拋出IOException
由於m1調用m2 ,因此m1也可能拋出該異常。
IOException不是從RuntimeException派生的,因此應明確聲明它可能被拋出的事實。
換句話說,add throws IOExceptionm1的聲明中。

任何調用另一個引發任何Checked異常的方法的方法都必須處理它們或引發它們。 如果未通過捕獲處理,則必須在方法的簽名中聲明異常,以便此類方法的任何調用者都知道要處理的異常。 Check Exception在某些特殊情況下是有意的,必須進行處理或拋出。 在您的情況下,因為m2()拋出checkedException,而m1()調用m2()因此m1()方法的Signature負責讓任何m1()調用者都知道有可能發生特殊情況必須處理的。 請注意,就您而言,您只是從main方法調用它,但這不會阻止您或任何其他開發人員將來從任何其他方法調用它 方法的責任是拋出已檢查的異常,以聲明存在例外情況並需要處理,調用者只需對其進行處理即可。

現在希望您了解您需要修改m1()的簽名並為IOException添加缺少的聲明。

讓我們看看JLS:11.3。 運行時異常處理說。

引發異常時(第14.18節),控制權從引起異常的代碼轉移到可以處理該異常的try語句(第14.20節)中最接近的動態封裝catch子句(如有)。

...

如果找不到可以處理異常的catch子句,則終止當前線程(遇到異常的線程)。 在終止之前,將根據以下規則執行所有finally子句,並處理未捕獲的異常:

在示例之后:

方法拋出者的聲明必須具有throws子句,因為它可以拋出TestException的實例,TestException是已檢查的異常類(第11.1.1節)。 如果忽略throws子句,則會發生編譯時錯誤。

最后一條語句正是您的情況, m1省略了throws子句,因此發生了編譯時錯誤。 添加throws IOException或此Exception的任何超類/接口以更正此錯誤。

注意:有趣的是,如果嘗試使用實際代碼從main捕獲IOException ,則將因嘗試捕獲未拋出的異常而收到另一個編譯時錯誤。 但這不是Exception的情況,因為這種情況僅在已檢查的異常中發生,因為Exception只能是RuntimeException未檢查的異常 ,所以不是這種情況。

JLS中的更多信息:11.2。 編譯時檢查異常

暫無
暫無

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

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