使用 Optional.orElseThrow 在 Stream 中抛出 RuntimeException

Posted

技术标签:

【中文标题】使用 Optional.orElseThrow 在 Stream 中抛出 RuntimeException【英文标题】:Throw RuntimeException inside Stream with Optional.orElseThrow 【发布时间】:2016-12-28 19:13:21 【问题描述】:

以下代码可以正常工作:

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)))
   // ...

我得到一个编译时错误:

错误:(129, 33) java: 未报告的异常 X;必须被抓住或 宣布被抛出

两者都抛出 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"

【问题讨论】:

您使用的是什么 Java 版本?对我来说,这在 Java 8_60 上运行良好 好像是***.com/questions/25523375/…的副本 它可能对我有用,因为我尝试使用 eclipse。在相关问题中,他们说这个错误不会影响 eclipse。 你说得对,我还必须在更新 JDK 后重新打开控制台。它使用 JDK 1.8.0_102 成功编译。 顺便说一句:openjdk 版本“1.8.0_91”也会出现该错误 【参考方案1】:

这是一个编译器错误JDK-8047338,它会阻止正确的通用异常类型推断。在1.8.0_92 版本中已部分解决。

【讨论】:

以上是关于使用 Optional.orElseThrow 在 Stream 中抛出 RuntimeException的主要内容,如果未能解决你的问题,请参考以下文章

在 spark 上使用集群和在本地使用并行操作有啥区别?

在哪里使用 CORBA 以及在哪里使用 SNMP 进行监控?

为啥在使用 unicode 时我不能在 :before :after 内容之后使用空格

在哪里使用 callable 以及在哪里使用 Runnable Interface?

在 Observable RxSwift 中使用 'asPromise()' 可以在 PromiseKit Promise 中使用吗?

可以在 SELECT 查询中使用 IF() 但不能在 UPDATE 中使用