有一种方法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)
...你真正说的是:返回我的可选值,但如果它不可用则抛出异常.
您似乎想要的是一种创建可选项(即时捕获异常)的方法,并在您尝试使用可选项时重新抛出该异常.
这不是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,则不会知道是否存在错误.