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

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

返回null 抛出异常 其他

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


当前回答

这取决于找不到对象意味着什么。

如果是正常状态,则返回null。这只是偶尔会发生的事情,调用者应该检查它。

如果是错误,则抛出异常,调用者应决定如何处理缺少对象的错误条件。

最终,这两种方法都可以工作,尽管大多数人通常认为只有在发生异常时才使用异常是一种良好的实践。

其他回答

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

只要它应该返回对象的引用,返回NULL就应该很好。

然而,如果它返回整个该死的东西(就像在c++中,如果你用'return blah;'而不是'return &blah'(或者'blah'是一个指针),那么你不能返回NULL,因为它不是'object'类型。在这种情况下,抛出异常或返回一个没有成功标志集的空白对象是我处理问题的方式。

我只是想概括一下之前提到的选项,并添加一些新的选项:

返回null 抛出异常 使用空对象模式 为您的方法提供一个布尔参数,以便调用者可以选择是否希望您抛出异常 提供一个额外的参数,以便调用者可以设置一个值,如果没有找到值,则返回该值

或者你可以把这些选项结合起来:

提供getter的多个重载版本,以便调用者可以决定采用哪种方式。在大多数情况下,只有第一个有搜索算法的实现,其他的只是围绕着第一个:

Object findObjectOrNull(String key);
Object findObjectOrThrow(String key) throws SomeException;
Object findObjectOrCreate(String key, SomeClass dataNeededToCreateNewObject);
Object findObjectOrDefault(String key, Object defaultReturnValue);

即使您选择只提供一个实现,您也可能希望使用这样的命名约定来阐明您的契约,并且它有助于您决定添加其他实现。

你不应该过度使用它,但它可能是有帮助的,特别是当你编写一个helper类时,你将在数百个不同的应用程序中使用许多不同的错误处理约定。

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

或者返回一个Option

选项基本上是一个容器类,它强制客户端处理展位案例。Scala有这个概念,查查它的API。

然后你在这个对象上有T getOrElse(T valueIfNull)这样的方法,它们要么返回找到的对象,要么返回客户端指定的替代对象。