java - 在Java8中的可选中抛出异常

标签 java java-8

有一个方法get(sql)(我不能修改)。此方法返回 MyObjects 并且它必须在 try catch block 中,因为那里可能存在 JqlParseException。我的代码是:

String sql = something;
try{
   MyObject object = get(sql);
} catch(JqlParseException e){
   e.printStackTrace();
} catch(RuntimeException e){
   e.printStackTrace();
}

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

MyObject object = Optional.ofNullable(get(sql)).orElseThrow(RuntimeException::new);

但 IDE 也强制在那里尝试 catch。 对于:

MyObject object = Optional.ofNullable(get(sql)).orElseThrow(JqlParseException::new));

是一个错误(在 IDE 中)JqlParseException 类型没有定义适用的 JqlParseException()。有什么办法可以避免 try catch block 并使用 optional 吗?

最佳答案

Optional 不是为了处理异常,而是为了处理潜在的 null 而不破坏程序的流程。例如:

 myOptional.map(Integer::parseInt).orElseThrow(() -> new RuntimeException("No data!");

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

当你写作时:

 myOptionalValue.orElseThrow(() -> new RuntimeException("Unavailable"));

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

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

关于java - 在Java8中的可选中抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42993428/

相关文章:

java - 将数组元素传递给可变参数

java - 为什么 java.util.function.Consumer 没有 identity()?

Java:将多个列表组合到一个列表中

java - 为什么我的线程不等待 CompletableFutures 完成 `allOf()` ?

java - TextInputLayout setError() 没有出现在 fragment 中

java - 使用静态连接时数据库挂起

java - 在没有 kotlin 代码的情况下,我真的需要使用 kapt 吗?

java - 尝试使用 apache commons-exec jar 打开 cmd 时出错

http - IPv6 环回地址 http ://0:0:0:0:0:0:0:1 - browser can't connect. 方法 getRemoteHost()

java - VSCode 和 WSL2 - 将 Java 语言级别指定为 1.8