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

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

返回null 抛出异常 其他

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


当前回答

返回null,异常就是:你的代码所做的不是预期的事情。

其他回答

只要问问你自己:“找不到对象是例外情况吗?”如果期望它在程序的正常过程中发生,则可能不应该引发异常(因为它不是异常行为)。

简短的版本:使用异常来处理异常行为,而不是处理程序中的正常控制流。

-工业。

返回空值而不是抛出异常,并在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。所以遵循规则,只有一个例外,如果你需要知道为什么没有找到值,那么总是抛出异常,或者。

只有在确实是错误时才抛出异常。如果对象不存在是预期行为,则返回null。

否则就是个人喜好的问题了。

只提到null不被认为是异常行为的情况,我肯定是try方法,很明显,没有必要“阅读书籍”或“三思而后行”,就像这里所说的那样

所以:

bool TryFindObject(RequestParam request, out ResponseParam response)

这意味着用户的代码也将是清晰的

...
if(TryFindObject(request, out response)
{
  handleSuccess(response)
}
else
{
  handleFailure()
}
...