반응형
Null Pointer Exception (NPE) — 빠르고 확실하게 해결하는 방법

요약: NPE는 대부분 '어떤 값이 null인데 그걸 사용하려 할 때' 발생합니다. 간단한 체크로 빠르게 막고, 복잡한 경우엔 근본 원인을 찾는 디버깅 전략이 필요합니다.
1. NPE가 뭔가요?
객체 레퍼런스가 null인데 그 객체의 필드/메서드/인덱스에 접근하려 할 때 JVM이 던지는 예외입니다. 예: myObj.toString()에서 myObj가 null일 때.
2. 초간단 해결법
2-1. null 체크
if (obj != null) {
obj.doSomething();
}
2-2. 기본값 사용
String s = maybeNullString != null ? maybeNullString : "";
2-3. Objects.requireNonNull (fail-fast)
Objects.requireNonNull(user, "user must not be null");
2-4. Optional 사용 (Java 8+)
Optional.ofNullable(user)
.map(User::getName)
.orElse("Anonymous");
3. 복잡한 경우의 수별 해결 전략
3-1. 스택 트레이스부터 읽어라
예외 로그의 첫 번째 '내 프로젝트' 라인(패키지 경로 포함)이 실제 NPE 발생 위치입니다. 파일명·라인번호를 확인해 해당 코드로 바로 이동하세요.
3-2. 디버거로 현장 재현
- 브레이크포인트를 걸고 해당 라인 실행 직전 변수 상태를 살펴보세요.
- 어떤 변수(또는 반환값)가
null인지 확인하면 원인 추적이 빨라집니다.
3-3. 초기화 순서 문제 (static / DI / 생성자)
특히 static 블록, 싱글톤, 의존성 주입 라이프사이클에서 객체가 예상보다 먼저 사용돼 발생합니다. 생성자에서 다른 메서드를 호출하면 아직 초기화되지 않은 필드를 참조할 수 있습니다.
// 위험한 패턴
public class A {
private final B b = new B(this);
public A() { /* ... */ }
}
// 안전한 패턴: 생성자에서 명시적으로 초기화
public class A {
private final B b;
public A() {
b = new B(this);
}
}
3-4. 동시성(Concurrency) 관련 NPE
여러 스레드가 객체를 동시에 변경/초기화하는 경우 null 상태가 노출될 수 있습니다. 해결책:
- 불변 객체(Immutable)를 사용하거나
- 적절한 동기화(lock), volatile, 또는
AtomicReference사용 - Double-checked locking 시 주의 — volatile 필요
3-5. 외부 입력/라이브러리에서 온 null
API 응답, DB 조회, 파라미터 등 외부에서 들어오는 값은 항상 검증하세요. 특히 REST 응답 파싱 후 필드가 없을 수 있습니다.
// Jackson 예시
User user = objectMapper.readValue(json, User.class);
if (user.getAddress() != null) {
// 안전하게 사용
}
3-6. Null Object Pattern
특정 인터페이스에 대해 빈(Null) 구현체를 제공하면 null 체크를 대폭 줄일 수 있습니다.
반응형
'개발 · IT > error' 카테고리의 다른 글
| 🚨 Runtime Errors(실행 시간 오류) 해결 가이드 (0) | 2025.12.15 |
|---|---|
| Logic Errors(논리 오류) 해결법 (0) | 2025.12.11 |
| Syntax Errors(구문 오류) 빠르게 해결하는 법 (0) | 2025.12.09 |
| java: constructor ~ in class ~ cannot be applied to given types (1) | 2023.10.14 |
| [ERROR] Failed to execute goal on project ~ Blocked mirror for repositories (2) | 2023.10.05 |
댓글