(JAVA) Null Pointer Exception

lgw2236·2023년 2월 27일
0

Java

목록 보기
7/8
post-thumbnail

Null ?

null 이란 참조형 변수가 아무것도 가리키지 않는 상태라는 의미입니다.

NullPointerException(NPE) 란?

런타임 예외의 한 종류로 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");
		}
		
	}
}

에러케이스 1.

EX1) toString() Error Case
=> toString()은 Object 값을 String 으로 변환 할 때 사용 할때 많이 사용하는 메소드인데, 해당 메소드는 null값을 문자열로 형 변환 시 NullPointerException를 발생시킵니다.

ex1 Case Prevention(예외 방지)

  1. toString() 대신 valueOf() 사용하기.
valueOf 매서드의 경우 toString()과 동일하게 Object 값을 String 으로 변환 할때
많이 사용하지만 해당 매서드의 경우에는 변환하는 오브젝트 값이 Null 일지라도 
해당 값을 문자열로 반환하기 때문에 NullPointerException을 방지할 수 있습니다.
  1. if 문으로 매서드 호출 전 parameter 값 확인 하기
public class nullPointerExceptionTest {

	public static void main(String[] args) throws Exception {
	 	String a = null;
        if(a != null){
           System.out.println(valueNull.toString());
           // 해당 오브젝트 값을 앞에서 null 체크 후에 null이 아닌 경우에만 
         // 로직에 태운다.
    	}
		
}

에러케이스 2.

EX2) a.equals(b) Error Case
=> 해당 테스트 코드에서 a 인 valueNull의 값이 Null 일 때 해당 Null인 a의값을 eqauls 메소드로 특정 b 값과 비교 하려고 할 때 NullPointerException를 발생시킵니다.

ex2 Case Prevention(예외 방지)

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 이
터지는 기본적인 원리를 계속 의식하면서 코딩하는게 중요해 보인다.

profile
어제보다 오늘 더

0개의 댓글