当前位置: 首页 > 知识库问答 >
问题:

是否有表示“未找到对象”的标准java异常类?

伯俊弼
2023-03-14

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

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库中找不到任何具有这种含义的异常类。您知道这里是否有可以使用的标准异常吗?

共有3个答案

景岳
2023-03-14

对于Java8,我建议在此用例中使用可选项。

Optional<User> findUserByName(Collection<User> users, String name){
    Optional<User> value = users
        .stream()
        .filter(a -> a.equals(name))
        .findFirst();
}

这也让调用者非常清楚,如果找不到该值,则optional可以为空。如果确实要引发异常,可以在Optional中使用orElseThrows来实现它。

冯阳云
2023-03-14

这里有时会使用IllegalArgumentException,但使用自己的异常是完全可以的。

顺便提一下,我建议使用一个映射,以字符串名称作为键,以用户作为值。这样就不需要在集合上进行迭代,并且可以防止集合中有两个同名的用户。如果您不想使用映射,那么至少要像这样防御NullPointerException:

User findUserByName(Collection<User> users, String name) throws ObjectNotFoundException
{
  if (name == null)
  {
    throw new IllegalArgumentException("name parameter must not be null");
  }
  if (users == null)
  {
    throw new IllegalArgumentException("Collection of users must not be null");
  }
  for(User user : users)
  {
    if(name.equals(user.getName()))
    {
      return user;
    }
  }
  throw new ObjectNotFoundException("Unable to locate user with name: " + name);
}

戚泰
2023-03-14

您知道这里是否可以使用标准异常吗?

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

>

  • NoSuchElementException倾向于在您逐步执行序列或枚举时使用,其中您在这里拥有的是查找。

    IllegalArgumentException倾向于暗示参数出错,但在这种情况下,可能是调用者的假设不正确,或者是特定于应用程序逻辑的东西。

    自定义异常允许您(在javadocs中)确切地说出异常的含义。您还可以声明要检查。。。如果合适的话。

    (但是不要被诱惑使用Unknown nUserException。那将是可怕的错误;阅读javadoc!)

    还值得考虑返回null,尤其是在应用程序中查找失败可能是相当常见(非异常)的情况下。然而,返回null的缺点是调用方需要检查null,或者冒意外的null点异常的风险。事实上,我认为过度使用null比过度使用异常更糟糕。前者可能导致应用程序不可靠,而后者“只”对性能有害。

    对于Java8及以后,返回可选比返回null更简洁。

    在这些事情上,重要的是要超越教条,根据实际情况做出决定。

  •  类似资料:
    • 问题内容: 考虑以下一般形式的函数: 例如,一个具体案例是: 如果找不到对象,这些函数将引发异常。我可以为此创建一个自定义的异常类(在示例中),但是我更喜欢使用现有的类。但是,我在标准java库中找不到具有此含义的任何异常类。您知道这里是否可以使用标准例外吗? 问题答案: 您知道这里是否可以使用标准例外吗? 有几个例外的是 可以 使用(例如或),但答案实际上取决于你想要传达的语义: 当您单步执行序

    • 我正在尝试使用ColdFusion和JavaLibrary解析CSV文件。我找到了一些示例,但ColdFusion似乎找不到Jar-File。 这是我的代码: 这是错误消息: 我正在使用opencsv库。Jar文件在以下文件夹中: www root/WEB-INF/lib 我还多次重新启动了服务器。 谢谢你的帮助!

    • 我见过类似的问题,但都与maven有关(我没有使用maven)。我在运行intellij并拥有Junit。jar 4.12已添加到库中。我可以创建测试方法和类。 问题是,当我尝试运行TestRunner()main方法时,立即出现以下错误 代码如下所示: 让我困惑的是,我在eclipse中使用了完全相同的代码(用于之前的项目测试),并且在那里工作得非常好。我错过了什么? 关闭和重新启动intell

    • 我正试图为我的Xamarin编写一个内容提供商。Android应用。 我有我的ContentProvider类(./ContentProviders/SitesProvider.cs): 在我的Androidanifest.xml中,我在元素中添加了以下内容 当我尝试运行我的应用程序时,我收到以下错误消息: JAVAlang.RuntimeException:'无法获取提供程序com。沙马林。样品

    • 问题内容: 我从这篇博客文章中获得了帮助: 但是我发现com.mysql.jdbc.driver类未找到异常。那篇博客文章的不同之处在于,在我的案例中,他们尝试连接到mysql而不是MS SQL。到目前为止,这是我的代码:package com.example.dbtry; 请告诉我我在做什么错。我还在清单中添加了对Internet的许可。 问题答案: 从以下位置下载jar:http://www.