반응형
NullPointerException 원인 분석 방법
Java 개발에서 가장 흔히 마주치는 예외 중 하나가 NullPointerException
입니다. 이 글에서는 NPE의 발생 원인, 스택 트레이스 분석법, 실전 예시, 예방 및 대응 팁을 정리합니다.
1. NullPointerException이란?
NullPointerException
은 null 값을 참조하여 객체의 메서드나 필드에 접근할 때 발생하는 런타임 예외입니다.
예:
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을 피하는 코딩 스타일과 도구를 활용하는 것이 최선의 예방입니다.
반응형
'Application Servers & Java' 카테고리의 다른 글
[장애 사례] JBoss 세션 저장 시 NotSerializableException 발생 원인과 해결 (1) | 2025.05.15 |
---|---|
[오류 해결] Invalid URL encoding 에러 원인과 해결 방법 (Spring + Tomcat 환경) (0) | 2025.05.14 |
[오류 해결] Unable to get managed connection for java:/jdbc/xxx 에러 원인과 해결 방법 (0) | 2025.05.14 |
Java 클래스 파일 위치 찾기 스크립트 (.class 또는 .jar 내부 포함) (0) | 2025.05.13 |
리눅스에서 CPU 사용량이 높은 자바 쓰레드(Thread) 찾는 방법 (0) | 2025.05.13 |