java - 是否有一个标准的 java 异常类表示 "The object was not found"?

标签 java exception standard-library

考虑以下一般形式的函数:

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?

有几个可以使用的异常(例如 NoSuchElementExceptionIllegalArgumentException),但答案实际上取决于您所使用的语义打算传达:

  • 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/

相关文章:

java - Spring IOC Bootstrap是否可能

java - 如何修复重复资源错误android studio

java - 运行 servlet 的问题

java - 异常没有被它的 catch block 捕获,然后该方法抛出另一种异常

c# - 在哪里可以找到 SocketException 抛出的 SocketErrorCode 和 NativeErrorCode 列表?

.net - 针对不同版本的 NETStandard.Library 的 project.json 依赖项

javascript - 将 javascript 变量分配给 java 变量

java - 并发修改异常问题

java - 将代码点附加到 java.lang.Appendable

python - python 标准库类/方法的综合引用