我想这触及了广阔的话题,但什么是在处理时比一切都被做了最好的方式理想变种其他程序的工作流程的最佳方法。
让我们更具体一点:
一类有一个方法,该方法运行在它的参数和返回结果。 例如:
public Map<Object,OurObject> doTheWork(OtherObject oo);
我排除了一个可能的结果是返回null
,一旦发生其他的方式,但理想。
有没有一种正确的方式处理这种情况(“银弹”,或所谓的“最佳做法”)?
我看其他三种结果:
1 - 该方法返回EMPTY_MAP;
2 - 该方法已检查异常;
3 - 投掷一个RuntimeException;
如果没有正确的一般问题的答案 - 是什么,应该考虑的条件是什么?
关于设计的合同原则(简单地说,该方法的责任是照顾输出,假设输入参数是正确的) - 是正确的方法来抛出任何异常或最好是空车返回的结果,但正确在结构(例如不为空)
返回null就像设置陷阱的人。 (在像HashMaps这样情况下,我们已经被训练看出来的空值,所以先例一起去即可。)用户必须知道看出来的空,他们必须代码的替代路径,以处理这种情况(这听起来很像处理异常),或风险的NPE(在这种情况下,异常得到反正抛出,只是不够丰富之一,从最初发生问题,在这个地方的距离,所以什么地方出了错信息会失踪)。
返回一个空的地图使它不清楚是否任何地方出了错与否。 它不是有害的象返回null,但它是完全不明确。 如果以某种方式返回地图数据纯粹是尽力而为的事情,用户并不真正需要知道,这可能是好的。 (但是,这是非常罕见的。)
如果您有什么期望用户能够做有关异常,抛出一个检查的异常可能是合适的。
如果有什么用户可以做的异常,或者如果异常只会因编程错误,或由于东西应该在测试过程中被抓到发生,那么一个说法,可以使用一个未经检查的异常制成。 有很多的空间,什么应该进行检查,什么应该是选中的分歧。
其办法是给被叫方最有利? 如果你需要知道的是一个空的地图或返回null,然后就是罚款。 如果您需要了解更多信息,那么一个异常会是一个更好的选择。
至于什么类型的异常,如果被叫方确实需要做一些事情才能恢复,那么检查的异常是合适的。 然而,一个未经检查的异常可能是更清洁。
至于返回null或空地图,要看是什么被叫方会用它做。 如果你希望被叫方采取的地图,并通过它周围的其他地方,然后空地图是一个更好的选择。
如果事情在你的方法打破了,因为输入错误的用户需要知道。 因此,一个例外是最好的一段路要走。 返回空或空数据可能使用户认为没有什么是错误的,绝对不是你想要的。
我敢打赌,有很多在计算器好的答案这个的。 之前,我搜索它们:
- 抛出异常只在特殊情况下-它们不用于正常的控制流。
- 经过抛出异常时,调用者应该能够从异常中恢复
- 当呼叫者可能不应该由于从抛出到编程错误异常如异常恢复unchecked异常抛出。
如果这是一个正常状态的空收集应返回。 尤其是当结果是一个集合,返回值不应为null。 如果返回值是零,那么就应该清楚地记录。 如果有需要的返回状态的更复杂的分析,你可能是用适当的模拟结果类更好。
这一切都取决于如何大的一个问题是如果doTheWork
。
如果问题是如此之大,该应用程序可能需要关闭然后抛出RuntimeException。
如果被叫方或许能够从问题中恢复再CheckedException是常见的。
如果一个空的地图是没有意义的话,就可以用来作为回报,但你必须要小心的是一个空的地图是不是一个成功的案例返回一个有效的值。
如果你只返回一个空,我建议在对返回值的Javadoc做注释。
在许多情况下,最好的方式是在try /做模式,其中许多程序有两个变化,如TryGetValue()和getValue()。 他们的目的是处理三种情形:
- 被成功地获得目标
- 不能得到的值,是有原因的调用者可以合理预期,以及系统状态是什么呼叫者会期望给这样的故障。
- 不能得到的值,由于某种原因,呼叫者可能没有预期,否则系统状态的方式调用者不会想到损坏。
在try /做模式背后的想法是,有当主叫方将准备处理故障的时间,但也有其他次,其中主叫方可能会在失败的情况下做的唯一的事情是将抛出异常。 在后一种情况下,这将是它未能抛出异常,而不是要求调用者来完成它的方法更好。