티스토리 뷰




자바 언어로 프로그래밍을 하다보면 가장 자주 만나는 오류 중에 하나가 이 널포인트 익스셉션(NullPointerException)일거다. 일단 왜 발생하는지 원인에 대해 알아보자.


일단 Exception도 클래스기 때문에 공식 api 문서를 보고 판단해보자. 


https://docs.oracle.com/javase/10/docs/api/index.html?overview-summary.html


여기서 NullPointerException을 찾아보면...내가 영어를 무지 못하긴 하지만 번역기와 그간의 짬으로 약간은 이해한다. 한번 해석해보도록 하자. 




Thrown when an application attempts to use null in a case where an object is required. These include:
  • Calling the instance method of a null object.
  • Accessing or modifying the field of a null object.
  • Taking the length of null as if it were an array.
  • Accessing or modifying the slots of null as if it were an array.
  • Throwing null as if it were a Throwable value.


객체가 필요한 경우에 어플리케이션이 null를 사용하려고하면 throw됩니다. 여기에는 다음이 포함됩니다.

- 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;


번역과 예시를 나름 해봤는데 아마도 이런 유형일 때 난다고 하는데 나는 후배들에게 설명할때는 항상 그리 얘기하곤 한다. 딱히 초기화를 하지 않으면 항상 null일 거고 니네들이 객체에 쩜(.)을 찍으면 날거야. 그러니 공통 아키를 잡을 때 null 처리에 대해 미리 기준을 정해라. null 대신 string은 blank를 넣고 array나 collection류도 빈껍데기를 넣던지 해서 null 에러를 원천 봉쇄해라. 


그리고 실제 어플리케이션에서도 null이 나지 않도록 설계와 예외처리를 치밀하게 하는 것이 좋다. 라고얘길 하긴 하는거 같은데... 


null 잡으려다 초가삼간 태운다고... 에러가 나지 않는 에러를 만들게 되는 경우가 있으니 그 경우는 더더욱 조심해야 한다. 차라리 Null 에러가 발생해서 인지할수 있게 되거나 해당 비지니스가 동작하지 않아 조치할수가 있으면 다행인데 ... 


null 에러도 발생하지 않아 아예 까마득히 모르고 버그와 함께 지내게 되는 경우가 왕왕있다. null 에러만큼 귀찮은것도 없지만 경우에 따라 심각한 버그를 캐치하지 못한채 운영하게 되는 수가 생긴다. 


예방은 아까 말한대로 


첫번째. 초기화시 null이 없도록 해라.


(1). String str = "";

(2). String[] arrStr = new String[0]; arrStr[0]="";

(3). List list = new ArrayList();


와 같은 식으로 쩜(.)을 찍어도 에러가 나지 않도록 초기화 세팅을 해라. 공통 아키쪽에서... 무심코 null체크를 하지 않은 어플리케이션에서의 null 에러를 예방해줄것이다. 


두번째. 길이체크나 빈값 체크 등은 공통 유틸리티를 만들어서 써라. 


프로그램 내에서 일일이 null 체크를 하도록 코딩하는 것도 좋지만, null 체크까지 같이 해주는 공통 유틸리티를 작성해서 사용하는 것이 여러모로 좋다. 작성해두고 프로젝트 내 개발표준으로 지정해두면 이런 에러를 만나긴 힘들어진다. 


String이 비어있는 체크할일이 많고 길이 체크하는 일이 많은데 이럴 때 



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


과 같은 식으로 null 처리까지 같이 넣어두면 좋을거다. 배열이나 컬렉션 류 기능들도 모두 마찬가지다. 괜히 이런거 허술하게 했다가 나중에 NullPointerException 만나서 고생하지 말고 미리미리 예방하자... ㅎㅎ







댓글
최근에 올라온 글
최근에 달린 댓글