
목차 ▽열기
1. NullPointerException(NPE)란?
NullPointerException(NPE) 은 Java 프로그래밍에서 가장 흔하게 발생하는 런타임 오류 중 하나입니다.
즉, 객체가 null 상태일 때, 해당 객체의 속성이나 메서드에 접근하려고 하면 발생합니다.
쉽게 말해
"객체가 존재하지 않는데, 객체처럼 사용하려고 할 때 발생하는 오류!"
NullPointerException이 발생하는 원인
원인 설명
객체 초기화 누락 | 객체를 생성하지 않고 사용하려 할 때 |
배열 요소 초기화 누락 | 배열을 선언했지만 요소를 초기화하지 않고 접근할 때 |
컬렉션 요소 초기화 누락 | List 또는 Map 등에 null 값이 포함될 때 |
메소드 반환값이 null | 메소드에서 null을 반환하고, 그 값을 사용하려 할 때 |
외부 리소스 접근 | 존재하지 않는 파일이나 네트워크 자원에 접근할 때 |
2. NullPointerException 예제 코드
❌ NPE가 발생하는 코드
public class Main {
public static void main(String[] args) {
String str = null;
System.out.println(str.length()); // ❌ NullPointerException 발생
}
}
원인
str 객체가 null인데, str.length()를 호출하면서 NPE 발생!
3. NullPointerException 해결 방법
3-1. 객체 초기화하기
String str = "";
System.out.println(str.length()); // 정상 작동 ✅
🔹 null 대신 빈 문자열("")을 초기값으로 설정하면 오류를 예방할 수 있습니다.
3-2. null 체크 후 사용하기
if (str != null) {
System.out.println(str.length());
} else {
System.out.println("변수가 null 입니다.");
}
🔹 null인지 먼저 확인하고, 안전하게 접근합니다.
3-3. Optional을 사용하기 (Java 8 이상)
import java.util.Optional;
Optional<String> optionalStr = Optional.ofNullable(str);
optionalStr.ifPresent(s -> System.out.println(s.length()));
🔹 Optional.ofNullable()을 사용하면 null을 자동으로 방어할 수 있습니다.
3-4. 디버거로 추적하여 해결하기
✔ 디버거를 활용하면 NullPointerException이 발생하는 정확한 위치를 찾을 수 있습니다.
✔ breakpoint를 설정하여 변수가 null인지 확인하고 원인을 파악하세요.
3-5. 안전한 메소드 호출
if (object != null && object.getProperty() != null) {
System.out.println(object.getProperty().getSubProperty());
}
🔹 객체의 체인된 속성 호출을 안전하게 처리하는 방법입니다.
4. NullPointerException을 예방하는 방법
4-1. 객체 초기화 습관화하기
String str = ""; // `null` 대신 빈 문자열 사용
List<String> list = new ArrayList<>(); // 리스트도 초기화!
🔹 객체를 사용하기 전에 반드시 초기화하는 습관을 들이세요.
4-2. 방어적 프로그래밍 적용
public void process(String str) {
if (str == null) {
throw new IllegalArgumentException("입력 값이 null이면 안 됩니다.");
}
System.out.println(str.length());
}
🔹 메서드의 입력값을 미리 검사하여 null을 방지하세요.
4-3. 유효성 검사 라이브러리 활용
import org.apache.commons.lang3.Validate;
Validate.notNull(str, "입력값이 null이면 안 됩니다.");
🔹 Apache Commons Lang의 Validate.notNull()을 사용하면 null 방지가 쉬워집니다.
4-4. 코딩 표준 정하기
개발팀 내에서 null 처리에 대한 규칙을 정하고 준수하세요.
- 메소드가 null을 반환하지 않도록 하기
- 가능하면 Optional을 사용하여 null 방어
- null이 될 수 있는 변수는 반드시 체크 후 사용
5. 예제 시나리오: 컬렉션 사용 시 NullPointerException 방지
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add(null); // `null` 요소 추가 ❌
for (String item : list) {
if (item != null) {
System.out.println(item.length()); // ✅ 안전한 접근
} else {
System.out.println("Item is null"); // ❌ NPE 방지
}
}
}
}
null 체크를 통해 NullPointerException을 방지하는 방법을 보여줍니다.
6. 결론
NullPointerException(NPE)은 Java에서 가장 흔한 오류지만,
적절한 예방 조치를 취하면 쉽게 해결할 수 있습니다.
NPE 발생을 방지하는 방법 정리
- 객체를 반드시 초기화하고 사용하기
- null 체크 후 안전하게 접근하기
- Optional을 활용하여 null 방어
- 방어적 프로그래밍으로 null 값 체크
- 디버거를 활용하여 원인 추적하기
Java 개발자라면 NullPointerException을 잘 이해하고, 방어적인 코딩 습관을 가지는 것이 중요합니다.
이를 통해 더욱 견고하고 안정적인 프로그램을 만들 수 있습니다!
'Error Handling' 카테고리의 다른 글
152. [Streamlit] [Data Science] : 결측치가 많은 컬럼을 처리하는 방법 (0) | 2025.02.15 |
---|---|
146. [Error Handling] [Streamlit] : requirements.txt(프로젝트 필수 패키지) (0) | 2025.02.04 |
140. [Error Handling] [Streamlit] : Streamlit 사용 시 에러 발생 (0) | 2025.02.03 |
105. [Error Handling] [Python] 내장 함수 이름 재정의로 발생하는 오류 (0) | 2025.01.21 |
99. [Error Handling] [Python] 튜플(Tuple)과 소괄호 오류 (0) | 2025.01.20 |