티스토리 뷰

  • Java의 모든 레퍼런스 타입은 null을 가질 수 있다.
  • 그렇기 때문에 null인 객체를 참조하면 NullPointerException이 발생한다.
  • 지금부터 Java 14에 추가된 유용한 NullPointerException에 대해 살펴보자.

기존 NullPointerException

public class NullPointerExceptionsExample {
    public static void main(String[] args) {
        Song song = new Song();
        song.genre = new Genre();
        System.out.println(song.genre.name.toUpperCase());
    }

    static class Song {
        Genre genre;
    }

    static class Genre {
        String name;
    }
}
  • 위 코드를 실행하면 다음과 같은 결과가 나온다.
  • System.out.println(song.genre.name.toUpperCase());에서 song, genre, name은 모두 레퍼런스 타입이기 때문에 null을 가질 수 있다.
  • 하지만 위의 코드에서는 song, genre, name 중에 어떤 변수가 null을 가지고 있는지 알 수 없다.
  • NullPointerException이 발생한 위치(라인 번호)만 나타난다.
    • 캡쳐는 위의 실행 코드와 상단에 패키지 경로가 포함되어 있어서 라인 넘버가 예제와 다를 수 있다.

Java 14의 Helpful NullPointerExceptions

  • 예제는 위의 코드와 동일하다.
  • 여기서 추가해야 할 옵션이 있다.
    • java 명령어로 소스 코드를 실행할 때 -XX:+ShowCodeDetailsInExceptionMessages 옵션을 추가해서 실행해야 한다.
      • intellij를 사용할 경우
        • Run/Debug Configurations에서 VM options에 -XX:+ShowCodeDetailsInExceptionMessages를 추가하고 실행한다.
      • console, terminal 등에서 실행할 경우
        • java -XX:+ShowCodeDetailsInExceptionMessages 클래스파일로 실행한다.
    • Java 14에서 기본적으로 이 기능은 꺼져있기 때문이다.
  • 옵션을 추가해서 예제 코드를 실행하면 다음과 같은 결과가 나온다.
  • 이번에는 NullPointerException이 발생한 위치(라인 번호) 뿐만 아니라 Cannot invoke "String.toUpperCase()" because "song.genre.name" is null도 출력된다.
  • 소스 코드의 일부를 수정해서 다시 실행해보자.
public class NullPointerExceptionsExample {
    public static void main(String[] args) {
        Song song = new Song();
//        song.genre = new Genre();
        System.out.println(song.genre.name.toUpperCase());
    }

    static class Song {
        Genre genre;
    }

    static class Genre {
        String name;
    }
}
  • 위 코드를 실행하면 다음과 같은 결과가 나온다.
  • 이번에도 NullPointerException이 발생한 위치(라인 번호) 뿐만 아니라 Cannot read field "name" because "song.genre" is null도 출력된다.
  • 이처럼 Java 14에 추가된 Helpful NullPointerExceptions를 사용하면 실제로 NullPointerException이 발생한 변수를 알 수 있다.

복잡한 구조를 가지고 있는 소스 코드에서 NullPointerException이 발생한다면 굉장히 골치가 아프다.
라인 번호만 가지고 NullPointerException을 찾는다면 null을 가질 수 있는 객체 모두를 검사해봐야 하기 때문에 시간이 걸린다.
Java 14에 추가된 기능을 잘 활용해보자.

References

댓글