"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
또는 예기치 않은 위험을 무릅쓰다NullPointerException
s. 실제로, 나는 의 남용이null
예외를 남발하는 것보다 더 나쁘다는 거죠.전자는 애플리케이션을 신뢰할 수 없는 결과를 초래할 수 있지만, 후자는 성능에 "만" 나쁜 결과를 초래할 수 있습니다.
Java 8 이후의 경우,Optional
반품하는 것보다 더 깨끗한 선택이 될 것이다null
.
이러한 경우, 교리를 넘어 실제의 상황에 근거해 결단하는 것이 중요합니다.
IllegalArgumentException
여기서도 가끔 사용되지만 사용자만의 예외는 사용해도 괜찮습니다.
참고로 맵을 사용하는 것을 추천합니다.String name
User
가 없어 .그러면 컬렉션에 대해 반복할 필요가 없으며 컬렉션에 같은 이름의 사용자가 두 명 있는 것을 방지할 수 있습니다. 최소한 맵을 하지 않도록 방어하다.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
'source' 카테고리의 다른 글
베스트 프랙티스인 Vue 인스턴스를 생성할 때의 차이와 각 옵션을 언제 사용할지 이해하는 데 도움이 필요합니까? (0) | 2022.11.25 |
---|---|
MySQL 콘솔에서 화면을 지우려면 어떻게 해야 합니까? (0) | 2022.11.25 |
유사한 태그를 가진 SQL 게시물 선택 (0) | 2022.11.25 |
GET 매개 변수를 추가하여 URL 문자열 조작 (0) | 2022.11.25 |
실행으로 데이터 조작 문을 발행할 수 없습니다.쿼리() (0) | 2022.11.25 |