ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] NPE : 널포인트 Exception
    Programming🧑‍💻/Java 2023. 3. 16. 22:09

     

    Null Point Exception이 뭔데?

    자바는 null이라고 부르는 특별한 타입의 값을 허용하는데,  null은 참조변수가 아무값도 참조하고 있지 않은 상태를 나타낸다.

    String a = null;

    String type과 같이 참조형의 변수에 값을 할당하면 할당된 값은 변수가 가리키고 있는 힙상의 메모리의 주소를 의미한다.
    따라서 null이 할당되게 되면 해당 참조 변수는 실제로는 아무곳도 가리키지 않는 상태로 값이 없는 상태가 된다. 
     
    이 Null 값은 NullPointerException을 터뜨려서 자바 개발자들를 괴롭히는 골치 아픈 녀석으로 주의하지 않으면 자주 만나게 된다. 
    NullPointerException은 프로그램이 실행중에 null값인 변수에 접근을 시도하면 터지는 예외이다. 

     
    Null 참조의 개념을 창안한 Tony Hoare 조차도  " 그것은 100만 달러짜리 실수였다." 라고 할정도이니 말이다. 
    얼마나 많은 이들을 괴롭혀 왔는지 상상 가능할 것이다. 
     
    그러면 언제 이놈이 등장하는지 살펴봄으로써 주의할 점을 알아보자. 
     

    너 어디서 나오는데?

    다음 코드를 한번 살펴보자 .

    String someString = null; 
    int size = someString.length();

    String은 가장 많이 사용되는 참조형으로서 현재 null 값이 들어가 있다. 
    두번째 행에서 null 값이 들어있는 someString 변수에 length() 메서드를 호출하면서 접근을 시도하는 순간 NPE를 내뱉는다. 
    NPE는 참조값이 없는 변수에 접근하려 했을 때 터지는 예외이다. 
    당연히 String 뿐만 아니라 다른 참조 변수도 null 값이 들어 있는데 접근을 시도하면 여지없이 NPE를 만난다. 
     
    따라서 내가 지금 사용하려는 참조형 변수에 값이 들어있지 않을 가능성이 있는 경우에는 다음과 같이 null이 아닌 값이 들어있는지 확인하는 절차가 필요하다.

    int size = someString != null ? someString.length() : 0;

     
    null 값이 들어있는 변수에 접근을 시도할시 예외가 터진다는 점을 유의하면 
     
    비교시에는 이 코드보다는 

    String str = null;
    
    if (str.equals("abc")) { 
        System.out.println("The same");
    }

    아래와 같이 null 값이 들어있을 수 있는 참조형 변수를 인자로서 비교하는 함으로서 NPE를 피할 수 있다. 

    String str = null;
    
    if ("abc".equals(str)) { // no NPE here
        System.out.println("The same");
    }

     
     

    정리하면

    1. NPE는 null 값이 들어있는 참조형 변수에 접근을 시도할 때 터지는 예외이다.
    2. NPE를 피하기 위해서는 객체를 사용하기 전에 값을 할당하는 초기화 절차를 까먹어서는 안된다. 
    3. 값이 들어있지 않을 가능성이 있는 경우에는 확인해서 사용해야한다. 
    4. Optional 대해 알아보자! -> NPE에 고통 받던 사람들이 만든 기능으로 값을 한번 감싸서 반환함으로써 예외를 막는다.  ★
     


    'Programming🧑‍💻 > Java' 카테고리의 다른 글

    [JAVA] 컴퓨터와 자바 메모리에 대한 이해  (0) 2023.03.07
    [JAVA] String Constant Pool은 무엇일까?  (0) 2022.12.17
    [JAVA] final  (0) 2022.10.25
    [JAVA] static  (0) 2022.10.21
    [JAVA] Enums  (0) 2022.10.08

    댓글

Designed by Tistory.