【问题标题】:Java: How to handle internally an exception if was thrown by the main method executed in an Optional?Java:如果在 Optional 中执行的主要方法抛出异常,如何在内部处理异常?
【发布时间】:2023-02-16 22:23:26
【问题描述】:

关于 Java Optional 具有以下模板

Optional.ofNullable(executeMethodA())
        .ifPresent(() -> executeMethodB());

这里有2个场景:

  • 如果executeMethodA()返回null那么ifPresent是不是执行
  • 如果executeMethodA()返回不是null 然后执行ifPresent

直到一切都OK。但是如果executeMethodA() 抛出一个Exception 呢?

有没有像

Optional.ofNullable(executeMethodA())
        .ifException(ex -> handleException(ex)) <---
        .ifPresent(() -> executeMethodB());

或者

Optional.ofNullable(executeMethodA())
        .ifException(ex -> { try/catch block}) <---
        .ifPresent(() -> executeMethodB());

目的是避免

try {
       Optional.ofNullable(executeMethodA())
               .ifPresent(() -> executeMethodB());
}
catch(Exception ex){
   ...
}

问题:

  • 如何处理在内部如果在 Optional 中执行的主要方法抛出异常?

【问题讨论】:

    标签: java exception


    【解决方案1】:

    它不仅不存在,而且不可能存在。

    在下面的表达式中,评估executeMethodA(),然后将结果传递给Optional.ofNullable。

    Optional.ofNullable(executeMethodA())
    

    如果 executeMethodA 抛出,则不会调用 Optional 上的任何方法。它无法创建某种方法链。

    In Brian Goetz' own words:

    可选旨在提供一个有限的库方法机制返回类型明确需要表示“无结果”,以及 其中绝大多数使用 null容易出错.

    它并非设计用于替换您应用程序中的每个条件分支,也永远不会设计用于替换应用程序中的每个条件分支。

    【讨论】:

    • 我明白了,但是如果 .ifException(ex -&gt; { try/catch block}) 会返回默认值或者只是传播原始异常或作为其他异常类型重新抛出怎么办。
    • @ManuelJordan 我真的不能用比现在更好的词来表达它了。如果该方法抛出异常,则 Optional 中没有任何内容。在 Optional 上没有你可以发明的可行的链接方法。
    【解决方案2】:

    Afaik 没有内置的机制。我也不认为它甚至打算取代 try-catch。一种方法是将实例化移动到单独的调用中,例如

    private Optional<YourObject> executeMethodA() {
        try {
            return Optional.of(YourObject);
        } catch (YourObjectException e) {
            // do whatever
        }
        return Optional.empty();
    }
    
    executeMethodA().ifPresent(() -> executeMethodB());
    

    您也可以使其更通用,但这取决于您。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-15
      • 2019-07-19
      • 1970-01-01
      • 2016-04-03
      • 2011-12-12
      • 1970-01-01
      • 2017-05-05
      相关资源
      最近更新 更多