[英]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 IOException
到m1
的聲明中。
任何調用另一個引發任何Checked異常的方法的方法都必須處理它們或引發它們。 如果未通過捕獲處理,則必須在方法的簽名中聲明異常,以便此類方法的任何調用者都知道要處理的異常。 Check Exception在某些特殊情況下是有意的,必須進行處理或拋出。 在您的情況下,因為m2()
拋出checkedException,而m1()
調用m2()
因此m1()
方法的Signature負責讓任何m1()
調用者都知道有可能發生特殊情況必須處理的。 請注意,就您而言,您只是從main方法調用它,但這不會阻止您或任何其他開發人員將來從任何其他方法調用它 。 方法的責任是拋出已檢查的異常,以聲明存在例外情況並需要處理,調用者只需對其進行處理即可。
現在希望您了解您需要修改m1()
的簽名並為IOException
添加缺少的聲明。
引發異常時(第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
的未檢查的異常 ,所以不是這種情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.