在使用Optional.orElseThrow时如何在Stream中抛出RuntimeException

18

以下代码工作正常:

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上运行良好。 - Jan Gassen
2
似乎是一个重复的 https://dev59.com/K18e5IYBdhLWcg3wpLsr。 - Jan Gassen
它可能对我起作用是因为我尝试使用了Eclipse。在相关的问题中,他们说这个bug不知何故不影响Eclipse。 - Jan Gassen
1
你说得对,我在更新了JDK之后也不得不重新打开我的控制台。它成功地使用JDK 1.8.0_102进行编译。 - Journeycorner
1
顺便说一下:这个错误也出现在openjdk版本“1.8.0_91”中。 - Journeycorner
显示剩余2条评论
1个回答

17

这是一个编译器错误JDK-8047338,导致泛型异常类型推断不正确。它在1.8.0_92版本中部分得到了解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接