使用 Optional.orElseThrow 在 Stream 中抛出 RuntimeException
Throw RuntimeException inside Stream with Optional.orElseThrow
以下代码工作正常:
Stream.of("key1", "key2")
.map(key -> {
SomeObject foo = service.find(key);
if (foo == null) {
throw new RuntimeException("No entity found with key: " + key);
}
return foo;
})
// ...
但是,当我使用 Optional 中的 orElseThrow 时:
Stream.of("key1", "key2")
.map(key -> Optional.ofNullable(someService.find(key))
.orElseThrow(() -> new RuntimeException("No entity found with key: " + key)))
// ...
我遇到编译时错误:
Error:(129, 33) java: unreported exception X; must be caught or
declared to be thrown
两者都抛出 RuntimeException,知道为什么 Optional 的方法不起作用吗?
更新: 我的构建基础设施,我尝试用 IntelliJ 和 Maven 编译它:
$ mvn -version
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-10T17:41:47+01:00)
Maven home: C:\Tools\apache-maven-3.3.9
Java version: 1.8.0_91, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jdk1.8.0_91\jre
Default locale: de_AT, platform encoding: Cp1252
OS name: "windows 10", version: "10.0", arch: "amd64", family: "dos"
这是一个编译器错误 JDK-8047338,它会阻止正确的通用异常类型推断。它已在 1.8.0_92
版本中部分解决。
以下代码工作正常:
Stream.of("key1", "key2")
.map(key -> {
SomeObject foo = service.find(key);
if (foo == null) {
throw new RuntimeException("No entity found with key: " + key);
}
return foo;
})
// ...
但是,当我使用 Optional 中的 orElseThrow 时:
Stream.of("key1", "key2")
.map(key -> Optional.ofNullable(someService.find(key))
.orElseThrow(() -> new RuntimeException("No entity found with key: " + key)))
// ...
我遇到编译时错误:
Error:(129, 33) java: unreported exception X; must be caught or declared to be thrown
两者都抛出 RuntimeException,知道为什么 Optional 的方法不起作用吗?
更新: 我的构建基础设施,我尝试用 IntelliJ 和 Maven 编译它:
$ mvn -version
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-10T17:41:47+01:00)
Maven home: C:\Tools\apache-maven-3.3.9
Java version: 1.8.0_91, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jdk1.8.0_91\jre
Default locale: de_AT, platform encoding: Cp1252
OS name: "windows 10", version: "10.0", arch: "amd64", family: "dos"
这是一个编译器错误 JDK-8047338,它会阻止正确的通用异常类型推断。它已在 1.8.0_92
版本中部分解决。