繁体   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