揭開Java 中的謎團:「錯誤:未報告的異常」
遇到神秘的「錯誤:未報告的異常; 必須被抓住或被宣布被拋出」訊息?別擔心;理解這個編譯錯誤將闡明 Java 概念並指導您解決它。
解析錯誤訊息:
該錯誤表示您的程式碼已拋出或傳播已檢查異常名為XXX 且無法處理它
錯誤背後的概念:
Java將異常分為兩種:
- 檢查異常:派生自java.lang.Throwable和Exception,排除RuntimeException及其子類,這些異常必須在其封閉方法或構造函數中處理。
- 未檢查異常:由 Error 及其子類和 RuntimeException 及其子類組成,未檢查異常不需要明確處理。
解決問題:
要解決該錯誤,您必須透過以下任一方式處理程式碼中的已檢查異常:
- 捕捉並處理異常: 包含在try ... catch區塊中觸發異常的語句,如程式碼範例所示下面:
try {
// Code that may throw the checked exception
if (someFlag) {
throw new IOException("cannot read something");
}
// Subsequent code
} catch (IOException ex) {
// Handle the exception gracefully
}
登入後複製
- 宣告封閉的方法或建構子拋出例外:透過在方法或在建構函式宣告中新增throws XXX 子句,您可以委託處理方法或建構函式的呼叫者的異常的責任。以下是範例:
public void doThings() throws IOException {
// Code that may throw an IOException
if (someFlag) {
throw new IOException("cannot read something");
}
// Subsequent code
}
登入後複製
做出正確的選擇:
正確的方法取決於上下文以及您對異常的期望處理程式碼。在處理時考慮嚴重性等級和從異常中恢復的能力。
特殊注意事項:
- 靜態初始化程序: 由於語法限制,在靜態初始化器中處理檢查異常需要小心處理。考慮使用靜態塊來代替。
- 靜態區塊:檢查的異常必須在靜態區塊中捕獲,因為沒有封閉的上下文。
- Lambdas:由於 Lambda 使用的函數接口,因此無法引發未經檢查的異常。處理 lambda 本身內的異常。
- 多重異常: 如果儘管名稱相同,但異常的完全限定名稱不同,則這些異常是不同的。單獨處理它們。
其他資源:
- Oracle Java 教學:
- [catch 或指定要求](https://docs.oracle.com/javase/tutorial/essential/exceptions/catchexceptions.html#:~:text=catch 或指定要求)
- [捕捉與處理例外](https://docs.oracle.com/javase/tutorial/essential/exceptions/handling.html)
- [指定方法拋出的例外](https:/ /docs.oracle.com /javase/tutorial/essential/exceptions/ throwing.html)
以上是為什麼我在 Java 中收到'錯誤:未報告的異常;必須捕獲或聲明為拋出”?的詳細內容。更多資訊請關注PHP中文網其他相關文章!