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

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

返回null 抛出异常 其他

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


当前回答

这里还有一些建议。

如果返回一个集合,避免返回null,返回一个空集合,这使得枚举更容易处理,而不需要先进行空检查。

一些. net API使用thrownOnError参数的模式,如果对象没有找到,调用者可以选择是否真的是异常情况。类型。GetType就是一个例子。BCL的另一个常见模式是TryGet模式,其中返回一个布尔值,并通过输出参数传递值。

在某些情况下,您还可以考虑Null Object模式,它可以是默认的,也可以是没有行为的版本。关键是避免在整个代码库中进行空检查。更多信息请参见这里链接

其他回答

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

这里还有一些建议。

如果返回一个集合,避免返回null,返回一个空集合,这使得枚举更容易处理,而不需要先进行空检查。

一些. net API使用thrownOnError参数的模式,如果对象没有找到,调用者可以选择是否真的是异常情况。类型。GetType就是一个例子。BCL的另一个常见模式是TryGet模式,其中返回一个布尔值,并通过输出参数传递值。

在某些情况下,您还可以考虑Null Object模式,它可以是默认的,也可以是没有行为的版本。关键是避免在整个代码库中进行空检查。更多信息请参见这里链接

如果null从不表示错误,则返回null。

如果null始终是错误,则抛出异常。

如果null有时是一个异常,那么编写两个例程。一个例程抛出异常,另一个是布尔测试例程,它在输出参数中返回对象,如果没有找到对象,则返回false。

很难滥用Try例程。很容易忘记检查null。

所以当null是一个错误时,你只需要写

object o = FindObject();

当null不是错误时,您可以编写如下代码

if (TryFindObject(out object o)
  // Do something with o
else
  // o was not found

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

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

-工业。

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