考虑以下一般形式的函数:
Foo findFoo(Collection<Foo> foos, otherarguments)
throws ObjectNotFoundException {
for(Foo foo : foos){
if(/* foo meets some condition*/){
return foo;
}
}
throw new ObjectNotFoundException();
}
例如,一个具体的案例是:
User findUserByName(Collection<User> users, String name)
throws ObjectNotFoundException {
for(User user : users){
if(user.getName().equals(name)){
return user;
}
}
throw new ObjectNotFoundException();
}
如果找不到对象,这些函数会抛出异常。为此,我可以创建一个自定义异常类(在示例中,ObjectNotFoundException
),但我更喜欢使用现有的类。但是,我在标准 java 库中找不到任何具有此含义的异常类。你知道这里有没有可以使用的标准异常吗?
最佳答案
Do you know if there is a standard exception that can be used here?
有几个可以使用的异常(例如 NoSuchElementException
或 IllegalArgumentException
),但答案实际上取决于您所使用的语义打算传达:
NoSuchElementException
往往在您单步执行序列或枚举时使用,在这里您需要进行查找。IllegalArgumentException
往往暗示参数有误,但在这种情况下,可能是调用者的假设不正确,或者某些特定于应用程序逻辑的东西.自定义异常允许您(在 javadocs 中)准确地说出异常的含义。你也可以声明它是checked ...如果合适的话。
(但不要试图使用 UnknownUserException
。那将是非常错误的;请阅读 javadoc!)
返回 null
也是值得考虑的,尤其是当查找失败可能是您的应用程序中相当常见(非异常)的事件时。 然而,返回 null
的缺点是调用者需要检查 null
或冒着意外 NullPointerException
的风险。事实上,我认为过度使用 null
比过度使用异常更糟糕。前者可能导致应用程序不可靠,而后者“只是”对性能不利。
对于 Java 8 及更高版本,返回 Optional
比返回 null
更简洁。
在这些事情上,重要的是要超越教条,根据实际情况做出决定。
关于java - 是否有一个标准的 java 异常类表示 "The object was not found"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24760314/