在 Java8 的可选中抛出异常

新手上路,请多包涵

有一个方法 get(sql) (我不能修改它)。此方法返回 MyObjects 并且它必须位于 try catch 块中,因为 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 也强制尝试捕获。对于:

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

是一个错误(在 IDE 中) The type JqlParseException does not define JqlParseException() that is applicable 。有什么办法可以避免 try catch 块而使用 optional 吗?

原文由 joe paulens 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 424
2 个回答

Optional 不是为了处理异常,它是为了处理潜在的 null s 而不会中断程序的流程。例如:

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

如果可选项为空,这将自动跳过 map 步骤并直接转到 throw 步骤 - 一个很好的完整程序流程。

当你写:

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

…您真正要说的是:返回我的可选值,但如果不可用则抛出异常。

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

原文由 john16384 发布,翻译遵循 CC BY-SA 4.0 许可协议

这不是 Optionals 的工作方式。他们不会让 try-catch-blocks 过时。但是,您可以像这样引入一个新的包装函数:

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

您将不必再处理异常,但是如果您也得到一个空的 Optional,您将不知道是否有错误。

原文由 stevecross 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题