본문 바로가기

Programing/JVM(Java, Kotlin)

[Java8] Optional.of 쓸 때 주의할 점...

Optional 사용시 NULL이 가능한 값에 아래와 같이 사용하면 제대로 동작하지 않을 수 있다.


// Exception e

...

final Optional<String> message = Optional.of(e.getMessage());

MyException exception = new MyException(message.orElse("문제가 있습니다!"), getReturnUrl(gotoUrl));


원래 의도는 메세지를 가져왔을 때 없으면 기본 메세지를 orElse 를 통해 우아하게(?) 사용하려고 하는 의도일 것이다.


하지만, java.util.Optional#of 의 경우 아래와 같이 시그너쳐가 되어 있다.

/**
* Returns an {@code Optional} with the specified present non-null value.
*
* @param <T> the class of the value
* @param value the value to be present, which must be non-null
* @return an {@code Optional} with the value present
* @throws NullPointerException if value is null
*/
public static <T> Optional<T> of(T value) {
return new Optional<>(value);
}

즉 value 값이 존재해야만 하며 널이 되어서는 안된다는 것이 덩그러니 주석으로 달려있다.

만약 of 를 쓰게 되면 내부적인 방어코드인 requireNonNull에 의해 NullPointerException 이 던져진다.

private Optional(T value) {
this.value = Objects.requireNonNull(value);
}
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}




만약 NULL일 수 있다면 아래와 같이 처리를 해야 할 것이다.

final Optional<String> message = Optional.ofNullable(e.getMessage());