[英]throw Throwable in Stream -> "Unhandled exception type Throwable"
有誰知道為什么在 Stream 中拋出 Throwable 或 Exception 不能在下面的代碼中編譯?
環境:Win 10 x64,Eclipse 2020-03,openJDK v14
public void myMethod(final boolean myBoolean) throws Throwable {
if (myBoolean) {throw new Exception("Compiler accepts this OK");}
if (myBoolean) {throw new Throwable("Compiler accepts this OK");}
Stream.of("").forEach(s -> {throw new Error("");});
Stream.of("").forEach(s -> {throw new RuntimeException("");});
Stream.of("").forEach(s -> {throw new Exception("Compiler -> Unhandled exception type Exception");});
Stream.of("").forEach(s -> {throw new Throwable("Compiler -> Unhandled exception type Throwable");});
}
我已經聲明該方法在它編譯好的 Stream 之外拋出 Throwable &,但在內部,我似乎只能拋出 Error & RuntimeException 的子類。
簡短的回答是Exception
和Throwable
是檢查異常。 已檢查異常的規則規定,它們必須要么在拋出它們的方法(或 lambda)中被捕獲,要么必須在方法(或功能接口)的throws
列表中聲明。
(另請參閱: “錯誤:未報告的異常 <XXX>; 必須被捕獲或聲明為被拋出”是什么意思,我該如何解決?對於某些背景。)
在您的示例中,這些事情都不實用。 因此,您應該避免在該上下文中拋出已檢查的異常。 改用未經檢查的異常; 即RuntimeException
或子類。
請注意,將方法聲明為throws Throwable
或throws Exception
是一個壞主意。 這有效地迫使調用者處理它(通常)不知道的1 個異常。 如果要使用已檢查異常,請使用特定於您發出信號的“異常條件”的異常。 如有必要,聲明一個自定義異常。
1 - ...要么處理它們,要么在其方法簽名中聲明它們!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.