null 이란 참조형 변수가 아무것도 가리키지 않는 상태라는 의미입니다.
런타임 예외의 한 종류로 Java는 개체 참조에 특별한 null 값을 할당합니다. 프로그램이 null 값으로 설정된 개체 참조를 사용하려고하면 해당 NullPointerException 을 throw 하게 됩니다.
이론적으로는 이해가 가지 않을 수 있으니, 아래의 테스트 코드로
NullPointerException 을 구현하겠습니다.
public class nullPointerExceptionTest {
/* test 코드 */
public static void main(String[] args) throws Exception {
try {
/* ex1) toString error */
String valueNull = null;
System.out.println(valueNull.toString());
/* ex2) equals 비교 error */
if(valueNull.equals(null)) {
System.out.println("Error test");
}
}catch (NullPointerException e) {
System.out.println("NullPointerException -- String Error");
}finally {
System.out.println("Finally");
}
}
}
EX1) toString() Error Case
=> toString()은 Object 값을 String 으로 변환 할 때 사용 할때 많이 사용하는 메소드인데, 해당 메소드는 null값을 문자열로 형 변환 시 NullPointerException를 발생시킵니다.
valueOf 매서드의 경우 toString()과 동일하게 Object 값을 String 으로 변환 할때
많이 사용하지만 해당 매서드의 경우에는 변환하는 오브젝트 값이 Null 일지라도
해당 값을 문자열로 반환하기 때문에 NullPointerException을 방지할 수 있습니다.
public class nullPointerExceptionTest {
public static void main(String[] args) throws Exception {
String a = null;
if(a != null){
System.out.println(valueNull.toString());
// 해당 오브젝트 값을 앞에서 null 체크 후에 null이 아닌 경우에만
// 로직에 태운다.
}
}
EX2) a.equals(b) Error Case
=> 해당 테스트 코드에서 a 인 valueNull의 값이 Null 일 때 해당 Null인 a의값을 eqauls 메소드로 특정 b 값과 비교 하려고 할 때 NullPointerException를 발생시킵니다.
public class nullPointerExceptionTest {
public static void main(String[] args) throws Exception {
String a = null;
String b = "null";
ex1)
System.out.println(" Result : " + a.equals(b));
// nullPointerException
ex2)
System.out.println(" Result2 : " + b.equals(a));
// Result2 : false
ex3)
System.out.println(" Result3 : " + "null".equals(a));
// Result3 : false
/* result 1의 경우 null 인 a값에 equals 메소드를 호출하여
nullPointerException 이 뱉어졌다.
result 2의 경우 "null" 인 b값에 equals 메소드를 호출하여
정상적인 문자열에 equals 메소드를 호출 하여 nullPointerException
이 발생하지 않았고, 해당 값의 비교값(Boolean)을 제대로 구할 수 있었다.
result 3의 경우 직접적으로 "null" 문자열에 equals 메소드를 호출하여
정상적인 문자열에 equals 메소드를 호출 하여 nullPointerException
이 발생하지 않았고, 해당 값의 비교값(Boolean)을 제대로 구할 수 있었다.
궁극적으로, equals 메소드를 쓸 때 nullPointerException을 방지 하기 위해선
-> parameter(object).equals(String) 순이 아닌
string.equals(parameter(object)) 형태로 해당 메소드를 사용하면
nullPointerException 을 방지할 수 있다.
}
짧게 나마 NullPointerException에 대해 공부해보았는데, 위의 케이스와 별도로
해당 Exception이 터지는 케이스는 무수히 많기 때문에 NullPointerException 이
터지는 기본적인 원리를 계속 의식하면서 코딩하는게 중요해 보인다.