在Java8中的可选项中抛出异常

joe*_*ens 24 java java-8

有一种方法get(sql)(我不能修改它).这个方法返回MyObjects,它必须在try catch块中,因为JqlParseException那里是可能的.我的代码是:

String sql = something;
try{
   MyObject object = get(sql);
} catch(JqlParseException e){
   e.printStackTrace();
} catch(RuntimeException e){
   e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

我想删除try catch并使用Optional类,我试过:

MyObject object = Optional.ofNullable(get(sql)).orElseThrow(RuntimeException::new);
Run Code Online (Sandbox Code Playgroud)

但是那里的IDE力量也尝试了.并为:

MyObject object = Optional.ofNullable(get(sql)).orElseThrow(JqlParseException::new));
Run Code Online (Sandbox Code Playgroud)

是一个错误(在IDE中)The type JqlParseException does not define JqlParseException() that is applicable.有没有办法避免尝试catch块并使用可选的?

joh*_*384 45

Optional它不是真正用于处理异常的目的,它旨在处理潜在的空值而不会破坏程序的流程.例如:

 myOptional.map(Integer::parseInt).orElseThrow(() -> new RuntimeException("No data!");
Run Code Online (Sandbox Code Playgroud)

map如果可选项为空,这将自动跳过该步骤并直接进入该throw步骤 - 一个不错的完整程序流程.

当你写:

 myOptionalValue.orElseThrow(() -> new RuntimeException("Unavailable"));
Run Code Online (Sandbox Code Playgroud)

...你真正说的是:返回我的可选值,但如果它不可用则抛出异常.

您似乎想要的是一种创建可选项(即时捕获异常)的方法,并在您尝试使用可选项时重新抛出该异常.


ste*_*oss 9

这不是Optionals的工作方式.它们不会使try-catch-blocks过时.但是,您可以引入一个新的包装函数,如下所示:

public Optional<MyObject> getMyObject(final String jql) {
    try {
        return Optional.ofNullable(get(sql));
    } catch (final JqlParseException e) {
        return Optional.empty();
    }
}
Run Code Online (Sandbox Code Playgroud)

您将不再需要处理异常,但如果您获得一个空的Optional,则不会知道是否存在错误.