错误: 未报告的异常错误X; 必须对其进行捕获或声明以便抛出
今天在jdk8环境中碰到一个诡异的异常:
错误: 未报告的异常错误X; 必须对其进行捕获或声明以便抛出
jdk8方便是方便,但是有点儿不好排查问题。看提示应该是有个方法抛出了异常,只能按方法去排查了。最后在java.util.Optional#orElseThrow
方法中找到了疑似代码。java.util.Optional#orElseThrow
:
1 | public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X { |
方法参数为异常产生器,X是Throwable
的子类。
我的原始写法是:
1 | .orElseThrow(() -> {throw new MaterialException("");}) |
本地jdk1.8_111
版本可以正常编绎,但是在服务器jdk1.8_152
、jdk1.8_65
上编绎出现上述异常。
尝试换了几种写法
1 | .orElseThrow(() -> {return new MaterialException("");}) |
按说上面几种写法语法上是差不多的,都出现异常。
最后在stackoverflow上找到了一些信息。这应该是jdk的一个bug,解决方案是在加上异常限定。
1 | .<MaterialException>orElseThrow(() -> {return new MaterialException("");}) |
IDEA会提示此限定是不必要的。其他版本未做测试。 希望后期这个bug能修复。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 水娃火娃石榴娃!
评论