본문 바로가기
개발 · IT/error

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

by 플라퉁 2025. 12. 10.
반응형

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

error image
요약: NPE는 대부분 '어떤 값이 null인데 그걸 사용하려 할 때' 발생합니다. 간단한 체크로 빠르게 막고, 복잡한 경우엔 근본 원인을 찾는 디버깅 전략이 필요합니다.

1. NPE가 뭔가요?

객체 레퍼런스가 null인데 그 객체의 필드/메서드/인덱스에 접근하려 할 때 JVM이 던지는 예외입니다. 예: myObj.toString()에서 myObjnull일 때.

 

 

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 체크를 대폭 줄일 수 있습니다.

 

 

반응형

댓글