首页 > 解决方案 > 空结果与可预测但不可预防的失败引发异常

问题描述

对于遇到可预测但无法预防的故障的方法,首选设计是什么?他们应该返回空结果还是在失败时抛出异常?请解释你的理由。

我将给出两个示例方法:

  1. 类似Arrays.binarySearch()的方法返回数组中值的索引。
  2. Tickets.buy(20, 100). 票务机器人尝试使用 100 美元购买至少 20 张票。该方法返回已购买的门票列表。

对于这两种方法,让我们假设用户无法预测该方法是否会成功找到匹配项。

如果出现以下情况,方法 1 可能会失败:

如果出现以下情况,方法 2 可能会失败:

Java 选择为方法 1 返回与空结果等效的结果,但对方法 2 执行相同操作将无法区分这两种错误。在两种可能的设计之间进行选择的准则是什么?

请注意,虽然这个问题包含两种具体方法,但我正在寻找一般设计指南,而不是上述方法的具体解决方案。

标签: javaexceptionoptional

解决方案


最佳方法取决于具体情况。

案例1: 由于该方法返回找到的元素的索引,-1如果没有找到所需的值,我建议返回。坚持几乎每个人都熟悉的众所周知的 API,比如 for indexOf().

案例 2: 这里我建议使用异常 ( InsufficientMoneyException, OutOfTicketsException, ...)。一个空列表或者null不是很有意义,并且不能反映不同的错误情况。这样您就可以正确处理它们各自的 catch 块中的异常。

通常,您必须记住,抛出异常是昂贵的操作,因为必须构建堆栈跟踪。


推荐阅读