【问题标题】:Java8 Stream .orElseThrow unreported exception errorJava8 Stream .orElseThrow 未报告的异常错误
【发布时间】:2020-02-07 21:27:02
【问题描述】:

我正在尝试追查为什么 Java 流中的 .orElseThrow 会发生特定行为。这个代码块

private SomeContainer getSomeContainerFromList(SomeContainerList containerList, String containerId) {

   return containerList.stream()
           .filter(specificContainer -> specificContainer.getId().equals(containerId))
           .findAny()
           .orElseThrow(() -> {
               String message = "some special failure message";
               log.error(message);
               throw new CustomInternalException(message)});
}

导致此错误:unreported exception X; must be caught or declared to be thrown

我不想报告异常,因为这会导致我将其添加到与之交互的所有其他方法中。

但是,当我删除花括号的 lambda 表达式时,只留下要抛出的新异常,如下所示:

private SomeContainer getSomeContainerFromList(SomeContainerList containerList, String containerId) {

   return containerList.stream()
           .filter(specificContainer -> specificContainer.getId().equals(containerId))
           .findAny()
           .orElseThrow(() -> new CustomInternalException("some special failure message"));
}

它编译得很好,并且不再需要报告异常,但是,我无法在该 .orElseThrow 语句中记录消息或执行任何其他逻辑。

为什么会这样?我看到了一种similar question,它解释了这可能是 JDK 中的一个错误,但我想确保在我的情况下是这种情况。

【问题讨论】:

标签: java exception java-8 java-stream


【解决方案1】:

不要抛出异常,返回它:

.orElseThrow(() -> {
    String message = "some special failure message";
    log.error(message);
    // change “throw” to “return”:
    return new CustomInternalException(message)});

.orElseThrow() 接受Supplier<Exception>,它应该返回,而不是抛出,一个异常。

【讨论】:

  • 哦,谢谢,我的错误我会编辑它。它实际上应该说抛出。
  • @Zach 这就是问题所在。 lambda 应该是异常的 Producer,而不是 throw
  • @Bohhemian,我明白了,所以现在有一个返回的异常,我需要在调用该方法时捕获它?
  • @Zach 如果流中没有任何内容与您的过滤器匹配,则将调用您的 lambda 并抛出其返回的异常。如果CustomInternalException 不是RuntimeException,则必须捕获它或将调用方法声明为throws CustomInternalException
  • 感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多