source

"The object was not found"를 의미하는 표준 Java 예외 클래스가 있습니까?

goodcode 2022. 11. 25. 21:31
반응형

"The object was not found"를 의미하는 표준 Java 예외 클래스가 있습니까?

다음과 같은 일반적인 형태의 함수를 고려합니다.

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 라이브러리에서 이 의미를 가진 예외 클래스를 찾을 수 없었습니다.여기서 사용할 수 있는 표준 예외가 있는지 알고 계십니까?

여기서 사용할 수 있는 표준 예외가 있는지 알고 계십니까?

사용할 수 있는 예외가 몇 가지 있습니다(예:NoSuchElementException또는IllegalArgumentException그러나 답은 전달하려는 의미에 따라 달라집니다.

  • NoSuchElementException는 시퀀스 또는 열거를 밟을 때 사용되는 경향이 있습니다.여기에서는 룩업이 사용됩니다.

  • IllegalArgumentException는 인수에 오류가 있음을 시사하는 경향이 있습니다만, 이 경우 발신자의 가정이 올바르지 않거나 애플리케이션로직 특유의 것일 수 있습니다.

  • 커스텀 예외를 사용하면 (javadocs에서) 예외의 의미를 정확하게 나타낼 수 있습니다.필요에 따라서, 체크 마크를 선언할 수도 있습니다.

(다만, 를 사용하고 싶은 유혹에 빠지지 말아 주세요.그건 정말 잘못됐어. javadoc을 읽어봐!)


반품도 고려해 볼 만하다.null특히 검색 실패가 응용 프로그램에서 상당히 일반적인(비표준) 이벤트일 가능성이 높은 경우.하지만 돌아오는 것의 단점은null발신자가 그 정보를 확인할 필요가 있다는 것입니다.null또는 예기치 않은 위험을 무릅쓰다NullPointerExceptions. 실제로, 나는 의 남용이null예외를 남발하는 것보다 더 나쁘다는 거죠.전자는 애플리케이션을 신뢰할 수 없는 결과를 초래할 수 있지만, 후자는 성능에 "만" 나쁜 결과를 초래할 수 있습니다.

Java 8 이후의 경우,Optional반품하는 것보다 더 깨끗한 선택이 될 것이다null.


이러한 경우, 교리를 넘어 실제의 상황에 근거해 결단하는 것이 중요합니다.

IllegalArgumentException여기서도 가끔 사용되지만 사용자만의 예외는 사용해도 괜찮습니다.

참고로 맵을 사용하는 것을 추천합니다.String nameUser가 없어 .그러면 컬렉션에 대해 반복할 필요가 없으며 컬렉션에 같은 이름의 사용자가 두 명 있는 것을 방지할 수 있습니다. 최소한 맵을 하지 않도록 방어하다.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);
}

Java 8에서는 이 사용 사례에 옵션 사용을 권장합니다.

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

이것에 의해, 값을 찾을 수 없는 경우, 옵션의 빈칸이 되는 것도 발신자에게 매우 명확하게 됩니다.는 '예외하다', '예외하다', '예외하다'를 사용하면 .orElseThrows옵션으로 실현합니다.

사용하시는 메서드의 문서화된 인터페이스 계약에 따라 달라집니다.

의 설명서에 「이러다」라고 되어 있는 는,name인수는 기존 사용자의 이름과 일치해야 합니다.그러면 이 인수는 적절한 것입니다.IllegalArgumentException이름을 찾을 수 없는 경우, 이는 발신자가 사용자에게 일치하지 않는 이름을 전달함으로써 메서드의 요건을 위반했음을 의미하기 때문입니다.

메서드가 이름이 기존 사용자와 일치해야 한다고 하지 않는 경우 알 수 없는 이름을 전달하는 것은 오류가 아니므로 예외를 발생시키지 마십시오. ★★★★null이 상황에서는 적절할 것입니다.

:findUserByName메서드는 기본적으로 메서드를 재창조하는 것입니다.null지지키키키키키을경경경경경경경경경경 。

언급URL : https://stackoverflow.com/questions/24760314/is-there-a-standard-java-exception-class-that-means-the-object-was-not-found

반응형