[英]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.