我正在使用Java语言,我有一个方法,如果找到了对象,就应该返回它。
如果没有找到,我应该:
- 返回null
- 抛出异常
- 其他
哪种是最佳实践或习惯用法?
我正在使用Java语言,我有一个方法,如果找到了对象,就应该返回它。
如果没有找到,我应该:
哪种是最佳实践或习惯用法?
如果您总是期望找到一个值,而它确实缺失,则抛出异常。异常表示出现了问题。
如果该值可能存在也可能不存在,并且对应用程序逻辑都是有效的,则返回 null。
更重要的是,您在代码其他地方要怎么做呢?一致性很重要。
GetPersonById(25)
如果该人已被删除,则会引发异常,但是 GetPeopleByHairColor("red")
则会返回空结果。所以,我认为参数反映了预期的某些方面。 - John Knoop一般原则是,如果方法总是应该返回一个对象,则使用异常。如果您预计偶尔会出现null并希望以某种方式处理它,则使用null。
无论做什么,我强烈反对第三个选项:返回一个字符串,上面写着"WTF"(什么鬼)。
如果 null 从不表示错误,则只需返回 null。
如果 null 总是表示错误,则抛出异常。
如果 null 有时表示异常,则编写两个例程。一个例程会抛出异常,另一个例程是一个布尔测试例程,它将该对象放在输出参数中,并且如果未找到该对象,则该例程返回 false。
使用 Try 例程很难误用。忘记检查 null 非常容易。
因此,当 null 表示错误时,只需编写
object o = FindObject();
当空值不是错误时,您可以编写类似以下的代码
if (TryFindObject(out object o)
// Do something with o
else
// o was not found
find
和findOrFail
。 - javier_domenechTryFindObject
方法中返回它吗?元组似乎更像是一种懒惰的编程范式,适用于那些不想花时间定义封装多个值的对象的程序员。本质上,这就是元组的全部内容。 - crush我想简要总结一下之前提到的选项,并提出一些新的选项:
或者您可以将这些选项组合起来:
提供多个重载版本的getter方法,以便调用者可以决定采取哪种方式。在大多数情况下,只有第一个版本包含搜索算法的实现,其他版本只是围绕第一个版本进行封装:
Object findObjectOrNull(String key);
Object findObjectOrThrow(String key) throws SomeException;
Object findObjectOrCreate(String key, SomeClass dataNeededToCreateNewObject);
Object findObjectOrDefault(String key, Object defaultReturnValue);
即使您选择只提供一个实现,您可能希望使用这样的命名约定来澄清您的合同,这有助于您决定添加其他实现时。
您不应过度使用它,但在编写将在许多不同应用程序中使用许多不同错误处理约定的帮助器类时,它可能会很有用。
Expected<T> findObject(String)
更加简洁地编写,其中Expected<T>
包含以下函数:orNull()
、orThrow()
、orSupplied(Supplier<T> supplier)
和orDefault(T default)
。这种方法将数据获取与错误处理分离。 - WorldSEnder使用空对象模式或抛出异常。
Person somePerson = personRepository.find("does-not-exist");
这个方法返回ID为 does-not-exist
的空对象。那么对于 somePerson.getAge()
,正确的行为是什么?目前为止,我还没有被说服认为空对象模式是解决实体查找问题的正确方案。 - Abdull抛出异常的优点:
更多解释和示例,请参见:http://metatations.com/2011/11/17/returning-null-vs-throwing-an-exception/
保持使用的API的一致性。
这取决于你的编程语言和代码是否采用:
尽管我同意上述观点……但异常应该用于异常/错误情况,使用检查时最好返回null。
Python中的EAFP vs. LBYL:
http://mail.python.org/pipermail/python-list/2003-May/205182.html
(网络档案)
只需问自己:“对象未被找到是否是一个例外情况?”如果在程序的正常流程中预计会发生这种情况,那么您可能不应该引发异常(因为这不是异常行为)。
简而言之:使用异常来处理异常行为,而不是处理程序的正常控制流程。
-艾伦。