[Spring | Java] NPE 발생과 예방법

BBANG-JUN·2020년 10월 20일
0

🍃Spring

목록 보기
12/26
post-thumbnail
post-custom-banner

▶ NPE : Null Point Exception

▶ 정의

- null 때문에 발생하는 Runtime Exception

▶ NPE 대부분 원인

- String 처리
- FileIO 처리
- 서버 송수신 처리

▶ NPE의 가장 큰 문제점

- null 자체의 의미가 모호해 다양한 파생 에러 발생        
- 에러 발생 이후 디버깅이 매우 어렵다고 함

▶ NPE의 대표적인 예시

- null 객체의 인스턴스 메서드를 호출합니다.

Object obj = null;     obj.toString();

- null 객체의 필드 액세스 또는 수정.

 Person p = null;     p.name = "nhj";

- 빈 배열 객체에 길이 속성을 가져올 때

int[] arrayInts = null;     arrayInts.length;

- 배열 슬롯 중 null 인 액세스하거나 수정합니다.

String[] arrayStr = new String[2]; arrayStr[0] = "aa";     arrayStr[1].toString(); 

- Throwable 값인 것처럼 null을 던집니다.

throw null;

▶ NPE의 예방법

1. 초기화시, null이 없도록 한다.

    (1) String str = "";
    (2) String[] arrStr = new String[0]; arrStr[0]="";
    (3) List list = new ArrayList();

2. 길이 체크 및 빈 값 체크 등은 공통 유틸리티를 만들어 사용한다.

    ex)    
    int length(String str){          
             if(str == null) return 0;
             return str.length();
    }

3. 의미없는 null 파라미터 사용하지 않기

    int length(){          

            .....
             return null;
    }

4. null 여부 확인 및 비교 처리 하기

   ex)  (baka = null) ? "0" : baka.length();

5. 문자열 비교는 Literal 기준이어야 한다.

   ex)

    String nemo = null;

    if("MEMO".equals(nemo)){}

6. toString() 대신 valueOf() 사용

    toString()은 객체를 참조해야만 하므로, 객체가 null일 경우 NPE를 발생시킵니다.

    하지만, valueOf()는 반환을 하기에 null값을 반환하면 "null"자체를 반환시켜 줍니다.

* toString()

    Integer num = null;
    System.out.println( num.toString() ); 에러

* valueOf()

    String str = null;
    System.out.println( str.toString() );
profile
🔥 머릿속으로 생각하지만 말고, 행동으로 보여줘
post-custom-banner

0개의 댓글