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());
'Programing > JVM(Java, Kotlin)' 카테고리의 다른 글
[Java] Generic in depth (0) | 2019.01.31 |
---|---|
Spock Framework 프로젝트에 추가하기 (0) | 2018.10.02 |
을/를, 이/가, 은/는 을 알아서 붙여주면 좋겠다. (0) | 2017.05.04 |
Java 8 - get & put -> computeIfAbsent 바꾸기 예제 (0) | 2017.01.10 |
[lombok] mutable 변수에 대한 PMD 에러 (0) | 2016.09.08 |