자바 NullPointerException 발생 원인 모음
자바에서 가장 많이 보는 Exception을 꼽으라면 역시 NullPointerException이다. 줄여서 NPE라고 하겠다.
NPE는 RunTimeException을 상속받은 Exception으로서
컴파일단계에서는 발생하지않고 실행도중에 발생한다.
기본적으로는 Null인 객체로부터 무언가를 하려고 하는 상황에서 발생한다.
여기서는 NPE의 해결방법보다는 단순히 어떤 상황에서 발생하는지만 작성하겠다.
(특이한 NPE를 마주칠 때마다 추가할 것이다.)
1. null인 객체의 메소드 또는 필드 사용
String str= null;
str.split("abcd");
가장 많이 보는 형태이다. 아마 여러분들이 경험하는 NPE도 대부분 이것일 것이다.
웹 개발에서는 파라미터가 넘어올 것으로 기대했는데 안 넘어온 경우 등에서 쉽게 발생한다.
2. primitive 타입 값에 null
int a=null;
다행히 이런 코드는 컴파일 단계에서 알려줘서 문제가 없다.
Integer integer=null;
int a=integer;
하지만 이런 코드는 컴파일단계에서 문제가 없지만 NPE가 발생한다.
primitive 타입 값이 들어가야 하는 곳에 null이 들어가 있기 때문에 발생한 NPE이다.
몇 가지 예를 들어보자.
2-1. null과 사칙연산
Integer num= null;
int a= num+5;
연산을 하려는데 null+5 가 된다. 이 때도 NPE가 발생한다.
2-2. for문과 if문 안에 null
Boolean is=null;
if(is) {
System.out.println();
}
Integer a=null;
for(int i=0 ; i<a ; i++){
System.out.println();
}
// 또는
for(int i=a ; i<5 ; i++){
System.out.println();
}
if안에는 boolean 값이 들어가야하고, for문안에도 int값이 들어가야 하는 곳에 null이 들어가있다.
모두 NPE가 발생한다.
2-3. 배열, 컬렉션안에 null 값이 있는데 정렬
String[] arr= {null,"a", "c","b"};
Arrays.sort(arr); //NPE
ArrayList<Integer> integerList=new ArrayList<>();
integerList.add(null);
integerList.add(1);
integerList.add(5);
integerList.add(3);
Collections.sort(integerList); //NPE
sort()메소드 내부에서 값을 비교할 때 null값과 비교하다보니 NPE가 발생한다.
NPE발생 원인은 크게 null.method() 아니면 primitive타입값에 null 들어가는 경우. 2가지밖에 없는거 같다.
다만 이걸 알아도 쉽게 NPE발생 원인을 특정하기 어려울 때 이 글이 도움이 되었으면 한다.
※이 외에도 해결이 어려웠던 NPE발생 상황이 있다면 댓글로 알려주세요.