이슈

[이슈] 스프링부트 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
반응형