티스토리 뷰

오늘 회사에서 운영하는 서비스에 장애가 발생되었는데 로그를 확인해보니 NullPointerException이 발생되었다.


그래서 해당 예외가 발생된 코드를 확인해봤는데 null값을 참조하여 코드를 작성한건 아니었다. 하지만 NullPointerException은 null값이 참조된 인스턴스의 필드 or 메서드를 호출한 경우 외에 다른상황에서도 발생될 수 있는데 그 케이스에 대해 알아보자.

NullPointerException (1)

str이라는 String 타입의 변수에 null을 할당하고 charAt() 메서드를 호출한 결과 NullPointerException이 발생되었다.

str이라는 변수에 null이 할당됨으로써 객체의 주소값이 메모리상에서 제거되어 참조할 수 없는 값이 할당되었기 때문에 NullPointerException이 발생된 것 이다.


이제 위 케이스 말고 다른케이스를 살펴보자.

NullPointerException (2)

18 Line에서 NullPointerException이 발생되었다. 일단 data 변수엔 Data 클래스의 인스턴스가 저장되어있으니 null은 아니다.그렇다면 문제점은 getValue() 메서드인데 한번 살펴보자.

 

현재 getValue()의 리턴값은 null이 할당된 Integer 타입의 변수인데 단순 null을 리턴하는 것 만으로 NullPointerException 이 발생되지는 않는다. 문제점은 Integer, Long과 같은 Wrapper 클래스들은 Primitive Type과 비교연산을 수행할 때 Auto UnBoxing이 일어나는데 이부분이 문제다. Auto UnBoxing은 Wrapper 클래스들의 유형을 Primitive Type으로 변환되어지는 과정을 말한다.

 

공식문서를 확인해보면 다음과 같은 설명이 있다.

The compiler does not generate an error because it invokes the intValue method to convert an Integer to an int at runtime

 

위 공식문서 내용은 Auto UnBoxing에 대한내용을 적은건데 그중에 이런문구가 있다. 컴파일러는 런타임에 Integer 를 int 로 변환하기 위해 intValue 메서드를 호출한다라고 적혀있다. 즉, 내부적으로 Integer 같은경우 intValue(), Long같은경우 longValue() 메서드가 호출되는데 이미 변수에 null이 할당되었으니 NullPointerException이 발생하게 된 것이다.

Not NullPointerException

그래서 이를 방지하기 위해선 null이 할당된 Wrapper 타입의 변수를 Auto UnBoxing이 일어나지 않도록 피연산자의 타입을 Wrapper 클래스로 해주면 발생되진 않는다.

 

예외케이스들이 두가지가 더 있는데 알아보자.

NullPointerException (3)

삼항연산를 수행할 때도 마찬가지로 조건식이 true면 기본형 데이터가 저장되지만 false면 참조형(Wrapper) 데이터가 저장되는데 이때도 마찬가지로 false에 걸리게 되면 Auto UnBoxing이 일어나게 된다. 이때는 1을 기본형이 아닌 Wrapper인 Integer로 선언해줘야 한다.

NullPointerException (4)

17 Line을 보면 map에 저장되지 않은 key로 데이터를 조회하니 null이 반환되지만 null값을 int 타입의 매개변수를 받는 메서드로 던져줄 때도 Auto UnBoxing이 발생되어 NullPointerException이 발생된다.

정리

  • Nullable한 Wrapper 타입의 데이터로 무언가 연산을 할 때 반드시 피연산자도 똑같이 Wrapper 타입으로 지정해줘야한다.
  • Wrapper 타입의 데이터를 메서드 파라미터로 전달할 때 메서드에 선언된 매개변수도 똑같이 Wrapper 타입으로 선언해야한다.
728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함