개발 공부용

NullPointerException(NPE)가 발생하는 이유 본문

Error

NullPointerException(NPE)가 발생하는 이유

솝제로 2025. 4. 11. 11:26

 

자바에서 Null은 참조형의 기본값이며 데이터 타입이 아니고 형변환을 허용하는 값이다.

NullPointerException은 특정 객체 참조가 Null일 때 그 객체를 사용하려고 시도해서 발생한다.

 

String name = null;
int length = name.length(); // 여기서 NPE

 

name이 null인데 length()를 호출해서 NPE가 발생한다.

Null에는 메소드나 필드 접근을 할 수 없기 때문이다.

 

if (item == null) {
    throw new NullArgumentException("item");
}

// 생략...

List<PortalMenu> children = getMenuItems(item.getPortal().getId(), item.getId());

 

이 코드에서 NPE가 발생했다.

item은 Null이면 예외를 던지므로 Null이 아님이 보장된다.

따라서 다음 4개의 경우의 수가 있다.

  1. children
  2. item.getPortal()
  3. item.getPortal().getId
  4. item.getId()

1번처럼 단순히 변수에 Null 값을 할당하는 것만으로 NPE가 발생하진 않는다.

3번과 4번이 Null이더라도, Null 객체에 메소드나 필드를 호출하는 것이 아니라,

단순히 Null 값을 넘기는 것이기 때문에 NPE가 발생하지 않는다.

 

=> 따라서 NPE가 발생한 원인은 2번 item.getPortal()임을 알 수 있다.

Null인 item.getPortal()에 getId를 호출해서 NPE가 발생했다.

 


 

 

스택 트레이스를 읽을 땐 Caused by 부분을 집중해서 봐야 한다.

Caused by: java.lang.NullPointerException
     at com.mycompany.service.impl.PortalManagerImpl.deleteMenuItem(PortalManagerImpl.java:603)
     at com.mycompany.service.impl.PortalManagerImpl.deletePortal(PortalManagerImpl.java:358)

 

위 스택 트레이스는

com.mycompany.service.impl.PortalManagerImpl 클래스의 deletePortal 메서드 358라인에서

deleteMenuItem 메서드를 호출했는데 해당 메서드의 603라인에서 NullPointerException이 발생했다고 해석할 수 있다.

 

 

 

참고 자료|

초보 개발자를 위한 스택트레이스 읽는 법 | OKKY