我使用java语言,我有一个方法,如果它被找到,应该返回一个对象。

如果没有找到,我是否应该:

返回null 抛出异常 其他

哪一个是最好的实践或习语?


当前回答

我更喜欢只返回null,并依赖于调用者来适当地处理它。(因为没有更好的词)例外是,如果我绝对“确定”这个方法将返回一个对象。在这种情况下,失败是一个例外,应该和应该抛出。

其他回答

不幸的是,JDK是不一致的,如果你试图访问资源包中不存在的键,你会得到not found异常,当你从map请求值时,如果它不存在,你会得到null。因此,我将获胜者答案更改为以下内容,如果找到的值可以为null,则在未找到时引发异常,否则返回null。所以遵循规则,只有一个例外,如果你需要知道为什么没有找到值,那么总是抛出异常,或者。

作为一般规则,如果方法应该总是返回一个对象,那么就使用例外。如果您预期偶尔会出现null,并希望以某种方式处理它,那么就使用null。

无论你做什么,我强烈建议反对第三种选择:返回一个字符串,说“WTF”。

这取决于方法的性质以及如何使用它。如果正常情况下可能找不到对象,则返回null。如果总是找到对象是正常行为,则抛出异常。

根据经验,只在发生异常时使用异常。不要在编写代码时将异常抛出和捕获作为其正常操作的一部分。

例外情况与契约式设计有关。

一个对象的接口实际上是两个对象之间的契约,调用方必须满足契约,否则接收方可能会异常失败。有两种可能的契约

1)所有输入的方法都是有效的,在这种情况下,当对象没有找到时必须返回null。

2)只有某些输入是有效的,即导致找到对象的输入。在这种情况下,您必须提供第二个方法,允许调用者确定其输入是否正确。例如

is_present(key)
find(key) throws Exception

当且仅当你提供了第二个契约的两个方法,你被允许抛出异常,但什么都没有发现!

如果没有找到它是一个异常事件(即在正常情况下它应该在那里),那么就扔掉它。否则,返回一个“notfound”值(可以为空,但不一定),或者甚至让方法返回一个布尔值来表示found/notfound,并为实际对象返回一个out参数。