DevLog/Java

java.lang.NullPointerException - 왜 null인지 모를 때

archive-log 2025. 5. 18. 12:40

✅ java.lang.NullPointerException

Exception in thread "main" java.lang.NullPointerException at com.example.MyClass.myMethod(MyClass.java:10)

 

 

🔍 자주 발생하는 케이스 

1. Spring에서 주입 실패

@Autowired 
private SomeService service; 

service.doSomething(); // 여기서 NullPointerException
  • 원인: 해당 빈이 스프링 컨텍스트에 등록되지 않았거나, 컴포넌트 스캔 대상이 아님
  • 해결: @Component, @Service, @Repository 등 어노테이션 누락 여부 확인

2. Map에서 존재한다고 착각한 key

Map<String, String> userMap = new HashMap<>();
userMap.put("username", null);
String username = userMap.get("username");
System.out.println(username.length()); // NullPointerException 발생
  • key는 존재하지만 value가 null일 수 있음

3. API 응답 후 바로 접근

UserResponse response = callExternalApi(); // response는 null일 수 있음 
System.out.println(response.getName());
  • 외부 시스템 에러 or 연결 실패로 response가 null인 경우

 

 

🛠️ 해결 방법

1. null 체크

if (user != null) { 
	System.out.println(user.getName()); 
}

2. Optional 활용

Optional.ofNullable(user).map(User::getName).ifPresent(System.out::println);
🚨 Optional을 사용할 때 주의할 점
Optional.get()은 null-safe하지 않으므로 ifPresent, orElse, orElseThrow 등과 함께 사용해야 함
DTO나 엔티티 필드에 Optional을 직접 쓰는 것은 권장되지 않음 (사용은 메서드 리턴값 중심으로)

 

3. 의존성 주입 확인

  • 클래스 위에 @Component, @Service 누락 여부
  • 생성자 주입 시 final 키워드와 함께 사용하는지
  • 테스트 코드에서 @Mock, @InjectMocks 설정 누락 여부

 

 

📌 정리

  • NullPointerException은 객체 주입 실패, API 응답 누락, 잘못된 값 가정 등 다양한 원인에서 발생
  • 아래와 같은 점들을 꾸준히 체크하면 NPE를 예방할 수 있음:
    • 의존성 주입이 제대로 이루어졌는지 확인
    • 외부 응답값은 항상 null 가능성을 고려
    • Optional은 get()보다는 ifPresent, orElseThrow 등으로 사용
    • IDE 설정과 Lombok(@NonNull) 어노테이션을 적극 활용