我使用java语言,我有一个方法,如果它被找到,应该返回一个对象。
如果没有找到,我是否应该:
返回null 抛出异常 其他
哪一个是最好的实践或习语?
我使用java语言,我有一个方法,如果它被找到,应该返回一个对象。
如果没有找到,我是否应该:
返回null 抛出异常 其他
哪一个是最好的实践或习语?
当前回答
例外情况与契约式设计有关。
一个对象的接口实际上是两个对象之间的契约,调用方必须满足契约,否则接收方可能会异常失败。有两种可能的契约
1)所有输入的方法都是有效的,在这种情况下,当对象没有找到时必须返回null。
2)只有某些输入是有效的,即导致找到对象的输入。在这种情况下,您必须提供第二个方法,允许调用者确定其输入是否正确。例如
is_present(key)
find(key) throws Exception
当且仅当你提供了第二个契约的两个方法,你被允许抛出异常,但什么都没有发现!
其他回答
如果没有找到它是一个异常事件(即在正常情况下它应该在那里),那么就扔掉它。否则,返回一个“notfound”值(可以为空,但不一定),或者甚至让方法返回一个布尔值来表示found/notfound,并为实际对象返回一个out参数。
这取决于你的方法。如果你的方法应该总是返回一个有效的对象,但却没有找到,那么抛出异常就是正确的方法。如果该方法只是返回一个可能存在也可能不存在的对象(比如联系人的图像),则不应该引发错误。
你可能还想公开一个返回布尔值true/false的方法,如果这个方法实际上会返回一个对象,这样你就不必a)检查null或b)捕捉异常
与您正在使用的API保持一致。
如果您总是希望找到一个值,那么如果缺少该值则抛出异常。这个例外意味着有问题。
如果该值可以缺失或存在,并且两者都对应用程序逻辑有效,则返回null。
更重要的是:在代码的其他地方做什么?一致性很重要。
我同意这里的共识(如果“未找到”是一个正常的可能结果,则返回null,或者如果情况的语义要求始终找到对象,则抛出异常)。
然而,根据你的具体情况,还有第三种可能是有意义的。您的方法可以在“not found”条件下返回某种类型的默认对象,允许调用代码确保它总是接收到有效的对象,而不需要进行空检查或异常捕获。