【问题标题】:returning java.util.Optional or throw (Checked/Unchecked)exception返回 java.util.Optional 或抛出 (Checked/Unchecked) 异常
【发布时间】:2017-08-08 23:57:58
【问题描述】:

我需要创建一个按员工姓名查找员工的方法。有以下三种可能的解决方案来实现这一点:

  1. 员工 findEmployeeById(long empId) 抛出 NoSuchEmployeeCheckedException;
  2. 可选的 findEmployeeById(long empId);
  3. 员工 findEmployeeById(long empId) 抛出 NoSuchEmployeeUnCheckedException;

如果 id 在我的存储库中匹配,第一种方法将返回一个员工实例,否则抛出一个检查异常实例NoSuchEmployeeCheckedException

第二种方法会返回一个java8的Optional实例,同时不会抛出异常。

最后一个方法和第一个类似,但是抛出一个UnCheck异常NoSuchEmployeeUnCheckedException的实例而不是checked异常。

我在 StackOverFlow 上阅读了多篇关于已检查与未检查异常的帖子。老实说,我仍然不太清楚如何正确使用它们。

《Effective Java》中的 Joshua Bloch 说过

对可恢复条件使用检查异常,对编程错误使用运行时异常(第 2 版中的第 58 条)

  1. findEmployeeById 是可恢复的条件吗?
  2. 我需要使用 Optional 还是抛出异常?
  3. 哪种解决方案最好?

【问题讨论】:

  • 以上都不是,返回一个Employee列表。该查询可以返回多行,因为可以有多个员工具有相同的姓名。如果没有匹配项返回一个空列表
  • 不需要考虑实际逻辑​​

标签: optional checked-exceptions unchecked-exception


【解决方案1】:

在特殊情况下使用例外,如果通常预计找不到员工,那么您可能不应该使用例外。
异常也有一些运行时开销,因为它们需要捕获堆栈跟踪。
在这种情况下,我会使用Optional,或者如果多个员工可以有相同的姓名,则返回某种类型的Collection,如果找不到员工则使用空集合。

【讨论】:

    猜你喜欢
    • 2011-07-01
    • 1970-01-01
    • 2012-12-22
    • 2012-06-08
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多