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

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

返回null 抛出异常 其他

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


当前回答

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

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

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

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

is_present(key)
find(key) throws Exception

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

其他回答

通常它应该返回null。调用该方法的代码应该决定是抛出异常还是尝试其他操作。

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

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

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

-工业。

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

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

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

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

is_present(key)
find(key) throws Exception

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

如果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