java.lang.NullPointerException 해결법
자바에서 NullPointerException은 RuntimeException입니다. 특수한 널 값은 객체 참조에 할당할 수 있습니다.
프로그램에 널값을 가지는 객체 참조를 사용하려고하면 NullPointerException이 throw됩니다.
+ null에 대해
- null이란 아무것도 없음을 의미합니다.(0또는 공백 : "")
- 모든 참조유형에 대한 기본 값은 null입니다.
- null은 유효한 객체 인스턴스가 아니므로 할당 되는 메모리가 없습니다.
+ 예외가 발생하는 경우
- null 객체에서 method를 호출하는 경우
- null 객체의 필드에 접근하거나 값을 변경하는 경우
- null 의 길이를 배열처럼 취하는 경우
- null 을 throw 하는 경우
- null 을 통해 동기화 할 경우
+ 그럼에도 null 값이 필요한 이유?
- 널은 자바에서 사용되는 특수 값입니다. 주로 참조 변수의 값이 할당되지 않았음을 나타내는데 사용됩니다.
- Null Object 패턴(로그 시스템) 및 Singleton 패턴에 사용됩니다.
- 연결된 목록 및 트리와 같은 데이터 구조를 구현하는 데 사용됩니다.
+ NullPointerException을 피하는 방법
1. 문자열 비교 : String 변수와 리티럴문자를 비교할 때 다음과 같은 오류가 발생할 수 있습니다.
String ptr = null;
if (ptr.equal("abc") // NullPointerException 발생!
{
System.out.println("SAME!");
}
else
{
System.out.println("NOT SAME!");
}
이는 다음과 같이 null객체 대신 리터럴문자에서 equal 메소드를 호출함으로써 해결할 수 있습니다.
String ptr = null;
if ("abc".equals(ptr))
{
System.out.println("SAME!");
}
else
{
System.out.println("NOT SAME!"); // "NOT SAME" 출력
}
2. try - catch문 사용 : 다음과 같이 예외처리문을 사용가능합니다.
public class Main {
public static void main(String[] arg) {
String s = null;
try
{
System.out.println(getLength(s));
}
catch(IllegalArgumentException e)
{
System.out.println("IllegalArgumentException caught"); // 예외처리 발생!!
}
}
public static int getLength(String s)
{
if (s == null)
{
throw new IllegalArgumentException("The argument cannot be null");
}
return s.length();
}
}
3. 삼항 연산자 사용 : null 값은 == 또는 != 의 연산자가 적용되기 때문이 이를 이용하여 다음과 같이 코드를 작성할 수 있습니다.
public class Main {
public static void main(String[] arg) {
String s = null;
System.out.println(s.length()); // NullPointerException 발생!!
}
}
위 코드를 아래와 같이 수정합니다.
public class Main {
public static void main(String[] arg) {
String s = null;
System.out.println((s == null) ? "0" : s.length()); // "0" 출력
}
}
이상 java.lang.NullPointerException에 대해 알아보았습니다.
자바 예외에 대해 더 알고싶은 분은 여기를 참고하세요.
또한 본 게시글에 대한 오류나 질문사항은 아래 댓글로 남겨주세요.
공감♡ 버튼을 눌러주시면 더욱 유용하고 좋은 포스팅으로 찾아 뵙겠습니다.
'Java' 카테고리의 다른 글
자바 Wrapper Class (0) | 2018.10.15 |
---|---|
자바 파일 입출력 (0) | 2018.10.04 |
자바 가비지 컬렉션(Java Garbage Collection) (0) | 2018.09.29 |
자바 벡터(Vector)와 어레이리스트(ArrayList) 비교 (5) | 2018.09.23 |
java.lang.ArrayIndexOutOfBoundsException 해결법 (0) | 2018.09.10 |
자바 foreach문 사용법 (0) | 2018.09.09 |
자바 배열 사용법 (0) | 2018.09.06 |
자바 String 문자열 사용법 정리 (1) | 2018.08.20 |