Application Servers & Java

NullPointerException 원인 분석 방법

midworker 2025. 5. 13. 20:48
반응형

NullPointerException 원인 분석 방법

Java 개발에서 가장 흔히 마주치는 예외 중 하나가 NullPointerException입니다. 이 글에서는 NPE의 발생 원인, 스택 트레이스 분석법, 실전 예시, 예방 및 대응 팁을 정리합니다.


1. NullPointerException이란?

NullPointerExceptionnull 값을 참조하여 객체의 메서드나 필드에 접근할 때 발생하는 런타임 예외입니다.

예:

String name = null;
int length = name.length();  // NPE 발생!

2. 대표적인 NPE 발생 케이스

케이스 설명
객체가 null인데 메서드 호출 obj.method() 형태에서 obj가 null
null 객체의 필드 접근 obj.field
배열이 null인데 인덱스 접근 arr[0] (arr이 null)
컬렉션 내부 값이 null map.get(key).toString()
리턴값을 바로 사용 findUser(id).getName() 등에서 null 리턴 시

3. 스택 트레이스 분석법

예외 메시지 예시:

Exception in thread "main" java.lang.NullPointerException
    at com.example.Main.process(Main.java:25)
    at com.example.Main.main(Main.java:12)

분석 포인트:

  • 가장 먼저 Exception in thread로 시작되는 라인에서 NPE 발생 위치 확인
  • at 패키지.클래스.메서드(파일명:줄번호)를 따라 실제 소스코드 추적
  • 원인 객체가 어떤 변수인지 파악 후 해당 변수가 어떻게 초기화되었는지 확인

4. 실전 예시 분석

public class Main {
    public static void main(String[] args) {
        User user = null;
        System.out.println(user.getName());
    }
}

스택 트레이스:

Exception in thread "main" java.lang.NullPointerException
    at Main.main(Main.java:5)
  • user가 null인데 getName()을 호출해서 발생
  • user가 어디서 null이 되었는지 소스 전체 흐름에서 추적 필요

5. 원인 추적 시 체크리스트

  • 해당 변수는 어디서 선언되고, 언제 초기화되었는가?
  • 외부 API 또는 DAO에서 null 리턴이 가능한가?
  • 조건문에서 null 체크를 했는가?
  • DI(의존성 주입) 대상이 초기화되지 않았는가?
  • 객체 간 체이닝(a.getB().getC())에 중간 null 가능성이 있는가?

6. 예방 및 대응 팁

  • Optional 사용: null 대신 명시적 empty 처리
  • Objects.requireNonNull()로 조기 감지
  • 방어적 코딩: null 체크 → if (obj != null)
  • IDE(예: IntelliJ)의 null 분석 도구 활용
  • Lombok의 @NonNull, Bean Validation @NotNull 사용

마무리

NullPointerException은 자바의 숙명 같은 예외입니다. 하지만 발생 위치를 빠르게 파악하고, 소스 흐름을 추적하는 습관만 들이면 복잡한 장애도 빠르게 대응할 수 있습니다.
장기적으로는 null을 피하는 코딩 스타일과 도구를 활용하는 것이 최선의 예방입니다.

반응형