Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
Tags
- 백준
- 향상된for문
- 동전교환알고리즘
- 파일사용권한
- 99클럽
- 프로그래머스
- 참조변수타입변환
- 네이티브애플리케이션
- 스프링
- Java
- 코딩테스트
- SQ3R
- 루트사용자
- API명세서
- API
- SQL
- 제너릭메서드
- 날씨API
- openapi
- 성장형마인드셋
- 재귀적사고
- 배열탐색
- Spring
- 자바
- 스레드동기화
- ChatGPT
- 프로젝트
- staging_area
- string메서드
- 4A피드백
Archives
- Today
- Total
개발 공부용
NullPointerException(NPE)가 발생하는 이유 본문
자바에서 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개의 경우의 수가 있다.
- children
- item.getPortal()
- item.getPortal().getId
- 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이 발생했다고 해석할 수 있다.
참고 자료|