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

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

返回null 抛出异常 其他

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


当前回答

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

其他回答

如果您总是希望找到一个值,那么如果缺少该值则抛出异常。这个例外意味着有问题。

如果该值可以缺失或存在,并且两者都对应用程序逻辑有效,则返回null。

更重要的是:在代码的其他地方做什么?一致性很重要。

使用空对象模式或抛出异常。

首选返回null——

如果调用者在不检查的情况下使用它,异常就会在那里发生。

如果调用者并没有真正使用它,不要给他一个try/catch块

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

所以:

bool TryFindObject(RequestParam request, out ResponseParam response)

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

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

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

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

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

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

is_present(key)
find(key) throws Exception

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