개발/Trouble Shooting

자바의 영원한 숙제: NullPointerException (NPE) 완벽 가이드

ophelisis 2025. 12. 29. 10:13
반응형

1. ❓ NullPointerException이란 무엇인가요?

NullPointerException은 객체 참조가 없는 상태(null)에서 해당 객체의 메서드를 호출하거나 필드에 접근하려 할 때 발생하는 언체크드 예외(Unchecked Exception)입니다.

실행 시점(Runtime)에 발생하기 때문에 컴파일러가 미리 잡아주지 않아 더욱 까다로운 예외입니다.


2. 🔍 주요 발생 원인

  1. 초기화되지 않은 객체 사용: 객체를 선언만 하고 new 키워드로 생성하지 않은 채 사용할 때
  2. 메서드 반환값 처리 미흡: 어떤 메서드가 null을 반환할 수 있는데, 이를 체크하지 않고 바로 메서드 체이닝을 할 때
  3. 컬렉션 내부 요소 접근: 리스트나 맵에 들어있는 요소가 null인 경우
  4. Auto-unboxing 오류: 래퍼 클래스(Integer, Boolean 등)가 null인 상태에서 기본 타입으로 변환될 때
Java
 
String str = null;
int length = str.length(); // 여기서 NPE 발생!

3. 🛡️ NPE를 방지하는 실전 방어 기법

✅ 1. 문자열 비교는 상수를 앞에 두기

Java
 
// 위험한 코드 (input이 null이면 NPE 발생)
if (input.equals("YES")) { ... }

// 안전한 코드 (상수를 앞에 두면 null이라도 false를 반환)
if ("YES".equals(input)) { ... }

✅ 2. Optional 클래스 활용 (Java 8+)

null일 가능성이 있는 객체를 감싸서 명시적으로 처리하도록 유도합니다.

Java
 
Optional<String> optionalStr = Optional.ofNullable(getName());
String name = optionalStr.orElse("이름 없음"); // null이면 기본값 사용

✅ 3. Objects.requireNonNull() 사용

파라미터가 null이면 안 되는 경우, 메서드 진입점에서 즉시 예외를 발생시켜 원인을 빠르게 찾을 수 있게 합니다.

Java
 
public void process(String data) {
    this.data = Objects.requireNonNull(data, "데이터는 null일 수 없습니다.");
}

✅ 4. 애너테이션 활용 (@NonNull, @Nullable)

IDE나 정적 분석 도구(Lombok 등)가 미리 경고를 줄 수 있도록 힌트를 제공합니다.


💡 시니어의 조언: 'null'을 반환하지 않는 것이 최고의 예외 처리

가장 좋은 예외 처리는 예외가 발생하지 않도록 구조를 짜는 것입니다.

  • 리스트나 배열을 반환할 때는 null 대신 **빈 컬렉션(Collections.emptyList())**을 반환하세요.
  • Optional은 반환 타입으로만 사용하고, 필드나 파라미터 타입으로 사용하는 것은 지양하세요.
반응형