返回java.util.Optional或throw(Checked / Unchecked)异常

时间:2017-08-08 23:57:58

标签: optional checked-exceptions unchecked-exception

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

  1. 员工findEmployeeById(long empId)抛出NoSuchEmployeeCheckedException;
  2. 可选的findEmployeeById(long empId);
  3. 员工findEmployeeById(long empId)抛出NoSuchEmployeeUnCheckedException;
  4. 如果id在我的存储库中匹配,第一种方法将返回employee的实例,否则抛出一个check exception NoSuchEmployeeCheckedException的实例

    第二种方法将返回java8的Optional实例,而没有抛出异常。

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

    我已经在StackOverFlow上阅读了有关已检查和未经检查的异常的多个帖子。老实说,我还是不太确定如何正确使用它们。

    “有效Java”中的Joshua Bloch说

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

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

1 个答案:

答案 0 :(得分:0)

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