https://mangkyu.tistory.com/70
null인 값에 접근할때 오류
Optional 클래스를 사용해 NPE를 방지할 수 있도록 도와준다.
Optional는 null이 올 수 있는 값을 감싸는 Wrapper 클래스로, 참조하더라도 NPE가 발생하지 않도록 도와준다.
Optional는 클래스이기 때문에 각종 메소드를 제공해준다.
Optional 생성하기:
Optional.of(value): 주어진 값으로 Optional 객체를 생성합니다. 값이 null이면 NullPointerException이 발생합니다.
Optional.ofNullable(value): 주어진 값으로 Optional 객체를 생성합니다. 값이 null이어도 문제 없이 Optional.empty()를 반환합니다.
Optional.empty(): 빈 Optional 객체를 생성합니다.
isPresent()
null인지 아닌지 불리언으로
get()
Optional에 담긴 값을 반환함.
없는 경우에는 NoSuchElementException이 발생합니다.
근데 이걸 쓰면 Optional 쓰는 의미가 없다
값 가져오기 (기본값 설정 가능):
orElse(기본값): 값이 존재하면 해당 값을 반환하고, null이면 주어진 기본값을 반환합니다.
orElseGet(Supplier<? extends T> supplier): 값이 존재하면 해당 값을 반환하고, 없는 경우에는 주어진 Supplier 함수에서 생성한 값을 반환합니다.
orElseThrow(Supplier<? extends X> exceptionSupplier): 값이 없는 경우에 주어진 예외를 발생시킵니다.
return opt.orElseThrow(() -> new Exception("asd"));
Optional.ofNullbale() - 값이 Null일수도, 아닐수도 있는 경우
만약 어떤 데이터가 null이 올 수도 있고 아닐 수도 있는 경우에는 Optional.ofNullbale로 생성할 수 있다. 그리고 이후에 orElse 또는 orElseGet 메소드를 이용해서 값이 없는 경우라도 안전하게 값을 가져올 수 있다.
isPresent()-get() 대신 orElse()/orElseGet()/orElseThrow() 쓰자
// 안 좋음
Optional<Member> member = ...;
if (member.isPresent()) {
return member.get();
} else {
return null;
}
// 좋음
Optional<Member> member = ...;
return member.orElse(null);
// 안 좋음
Optional<Member> member = ...;
if (member.isPresent()) {
return member.get();
} else {
throw new NoSuchElementException();
}
// 좋음
Optional<Member> member = ...;
return member.orElseThrow(() -> new NoSuchElementException());