본문 바로가기
백엔드 개발

java.lang.NullPointerException 원인 정리

by collenkim 2026. 3. 31.
반응형

1. 개요

NullPointerException(NPE)은 null인 객체를 참조하려고 할 때 발생하는 런타임 예외다.
자바에서 가장 많이 터지는 에러고, 대부분은 “기본적인 체크 누락”에서 나온다.


2. 대표 발생 케이스

1) 객체 초기화 누락

User user = null;
user.getName(); // NPE

 

서비스/DAO에서 객체 못 받아왔을 때 자주 발생

2) 메서드 리턴값이 null

User user = userService.findById(id);
user.getName(); // user가 null이면 터짐
DB 조회 결과 없음 / Optional 안 씀

3) 컬렉션 값 null

List<User> list = null;
list.size(); // NPE
초기화 안 된 리스트, 조건 분기 누락

4) Map에서 key 없음

map.get("key").toString(); // 값 없으면 null → NPE
실무에서 은근 많이 터짐

5) 의존성 주입 실패 (Spring)

@Autowired
private UserService userService;
Bean 등록 안 됐거나, 수동 생성(new)하면 null

6) 문자열 비교 실수

String str = null;
str.equals("test"); // NPE
항상 상수를 앞으로:

3. 실무에서 많이 터지는 위치

  • Controller → Service 호출 시
  • Service → DAO 결과 받을 때
  • 외부 API 응답 처리할 때
  • JSON 파싱 후 값 꺼낼 때
특히 “정상 케이스만 가정하고 코드 짤 때” 터진다

4. 해결 방법 (실무 기준)

1) null 체크 (기본)

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

2) Optional 사용

Optional<User> user = userService.findById(id);
user.ifPresent(u -> u.getName());

3) 기본값 처리

String name = (user != null) ? user.getName() : "";

4) 컬렉션 초기화 습관

List<User> list = new ArrayList<>();

5) 방어 코드 (가장 중요)

if (user == null) {
    throw new IllegalArgumentException("user is null");
}
초기에 터뜨리는 게 디버깅 훨씬 빠름

5. 디버깅 방법

1) 로그로 값 확인

log.info("user: {}", user);

2) 에러 라인 정확히 보기

스택 트레이스에서:

NullPointerException at UserService.java:45

3) 단계별 확인

  • 어디서 null 들어왔는지 역추적
  • Controller → Service → DAO 순으로 체크

6. 실무 팁

  • “절대 null 안 온다” → 100% 틀림
  • 외부 데이터는 무조건 null 가능성 있음
  • Optional 남발도 좋지 않지만, 조회 결과에는 유용

7. 정리

  • NPE는 대부분 초기화/검증 누락
  • 방어 코드 + 습관으로 충분히 줄일 수 있음
  • 중요한 건 “안 터지게”가 아니라 “빨리 찾게 만드는 것”
반응형