簡體   English   中英

在 Stream 中拋出 Throwable -> “未處理的異常類型 Throwable”

[英]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 的子類。

簡短的回答是ExceptionThrowable是檢查異常。 已檢查異常的規則規定,它們必須要么在拋出它們的方法(或 lambda)中被捕獲,要么必須在方法(或功能接口)的throws列表中聲明。

(另請參閱: “錯誤:未報告的異常 <XXX>; 必須被捕獲或聲明為被拋出”是什么意思,我該如何解決?對於某些背景。)

在您的示例中,這些事情都不實用。 因此,您應該避免在該上下文中拋出已檢查的異常。 改用未經檢查的異常; RuntimeException或子類。


請注意,將方法聲明為throws Throwablethrows Exception是一個壞主意。 這有效地迫使調用者處理它(通常)不知道的1 個異常。 如果要使用已檢查異常,請使用特定於您發出信號的“異常條件”的異常。 如有必要,聲明一個自定義異常。

1 - ...要么處理它們,要么在方法簽名中聲明它們!

暫無
暫無

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

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