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

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

返回null 抛出异常 其他

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


当前回答

不要认为任何人都提到了异常处理中的开销——需要额外的资源来加载和处理异常,所以除非它是一个真正的应用程序杀死或进程停止事件(继续下去会造成更多的伤害而不是好处),否则我会选择返回一个调用环境可以解释为它认为合适的值。

其他回答

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

与您正在使用的API保持一致。

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

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

返回空值而不是抛出异常,并在API文档中清楚地记录空返回值的可能性。如果调用代码不遵守API并检查空情况,它很可能会导致某种“空指针异常”:)

在c++中,我可以想到3种不同的方法来设置查找对象的方法。

选择一个

Object *findObject(Key &key);

当找不到对象时返回null。很好很简单。我选这个。下面的替代方法是为那些不讨厌out-params的人准备的。

选项B

void findObject(Key &key, Object &found);

传入一个将接收该对象的变量引用。当找不到对象时,该方法抛出异常。如果不是真的期望找不到对象,那么这种约定可能更适合——因此您可以抛出异常来表示这是一个意外情况。

C选项

bool findObject(Key &key, Object &found);

当找不到对象时,该方法返回false。与选项A相比,这个选项的优点是,您可以在一个明确的步骤中检查错误情况:

if (!findObject(myKey, myObj)) { ...

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