[Java/SpringBoot] Optional 관련한 Java8에서의 orElseThrow 에러

minjung·2022년 11월 26일
0

에러 해결 모음집

목록 보기
3/6

💡Optional 클래스

Optional은 Java8부터 지원하는 클래스로, NullPointException 즉, 널값으로 인해 발생하는 에러를 방지해주는 클래스이다.

Optional<T> 클래스와 관련한 설명은 이미 잘 정리된 기술블로그들이 많으니 구글링해서 찾아보길 권한다.

나는 참고로 이 블로그 봄


💡문제

패스트캠퍼스 강의를 들으며 Optional 클래스의 orElseThrow를 사용할 때 문제가 발생했다.

강의는 Java17 버전을 사용했지만 나는 이미 Java8 버전이 있었기 때문에 8버전으로 강의를 수강하고 있었는데, Java8 버전은 orElseThrow에 인자값을 받아야하는 반면 10 이상의 버전부터는 인자값이 필요 없다는 것이다.

첫 번째 생각

그러면 인자값을 넣어주자!
무엇을 넣어줄까?
에러와 관련된 거니까 대표적인 Exception을 넣어주자

Article article = articleRepository.findById(1L).orElseThrow(new Exception());

하지만 에러가 발생했다.
구글링을 해보니 new Exception()같은 방식이 아니라 다른 방식으로 쓰길래

Article article = articleRepository.findById(1L).orElseThrow(Exception::new);

이렇게도 써보았으나 여전히 에러가 났다.


+) 위 코드가 작성된 메소드에 throw Exception을 적어주면 에러가 해결된다.

void givenTestData_whenUpdating_thenWorksFine() throw Exception {

        Article article = articleRepository.findById(1L).orElseThrow(Exception::new);

        ...

}

이게 맞는 방법인지는 모르겠으나 해결된다.



두 번째 생각

그렇다면 articleOptional 타입으로 받자.

Optional<Article> article = Optional.ofNullable(articleRepository.findBy(1L));

그런데 이러면 결국 똑같은 문제의 반복 아닌가?
여전히 에러는 해결되지 않았다.


💡해결

첫 번째 생각의 코드를 기반으로 인자를 수정하니 문제가 해결되었다.

Exception이 아닌 다른 클래스를 적어주니 메소드에 throw를 적어주지 않아도 해결됐다!

내가 사용한 것은 런타임 에러 IllegalArgumentException

Article article = articleRepository.findById(1L).orElseThrow(IllegalArgumentException::new);

잘못된 해결 방법이거나 잘못된 정보가 있다면 언제든지 알려주세요 🙇

0개의 댓글