Java:如何在内部处理一个异常,如果是由一个可选的主方法抛出?

kokeuurv  于 2023-02-18  发布在  Java
关注(0)|答案(2)|浏览(147)

关于具有以下模板的Java Optional

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

这里有两种情况:

  • 如果executeMethodA()返回null,则执行ifPresent
  • 如果executeMethodA()返回而不是null,则执行ifPresent

直到一切正常。但是如果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){
   ...
}
    • 问题:**
  • 如何处理内部异常,如果抛出的主要方法中执行的一个可选?
ss2ws0br

ss2ws0br1#

它不仅不存在,而且不可能存在。
在下面的表达式中,计算executeMethodA(),然后将结果传递给Optional.ofNullable

Optional.ofNullable(executeMethodA())

如果executeMethodA抛出,则Optional上的任何方法都不会被调用,它无法创建某种类型的方法链。
In Brian Goetz' own words
可选的目的是为库方法***返回类型***提供一个***有限的***机制,其中明确需要表示"无结果",并且为此使用null***极有可能导致错误***。
它不是设计用来替换应用程序中的每个条件分支的,也永远不会设计成这样。

mec1mxoz

mec1mxoz2#

当然没有内置的机制来实现这个功能,而且我也不认为它会取代try-catch,一种方法是将示例化转移到一个单独的调用中。

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

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

你也可以使它更通用,但这取决于你。

相关问题