이슈
[이슈] 스프링부트 Optional orElse() vs orElseThrow()
Hyun-danpung2
2023. 3. 26. 13:15
728x90
반응형
상황
java.util.NoSuchElementException: No value present
원인
// A Service
Optional<String> a = bService.getA(id);
if(a.isPresent()){
do(a.get());
}
// B Service
public Optional<String> getA(int id){
C c = bRepository.findById(id).orElseThrow(); // Exception 발생 원인
return Optional.ofNullable(c.getA());
}
해결
Optional의 orElse()를 사용해야하는 상황에 orElseThrow()를 사용한 것이 문제였다.
orElseThrow()는 '내가 예외 처리를 하겠다'의 의미인데, 별도의 예외 처리를 하지 않기로 한 상황에서 사용했기 때문에 a가 존재하는 지 여부를 확인하는 a.isPresent()에서 NoSuchElementException가 발생했다.
다음과 같은 코드로 해결됐다.
// B Service
public Optional<String> getA(int id){
C c = bRepository.findById(id).orElse(new C());
return Optional.ofNullable(c.getA());
}
orElse의 경우 임의의 값을 넣어서 해결하겠다는 의미로, 빈 값을 넣어서 A Service의 a.isPresent()에서 발생하던 에러를 해결할 수 있었다.
728x90
반응형