본문 바로가기

IT 관련

[Java] NullPointException 관련 해결 및 예방하기

안녕하세요 초이스40입니다.

오늘은 Java에서 가장 많이 일어나는 오류중에 하나인 NullPointException에 관해서 이야기해볼까 합니다.

프로그램의 오류중에서 70~80% 정도가 NullPointException 또는 Null과 관련된 오류라고 생각합니다.

저 역시도 Null 관련 오류를 많이 발견하는데요

어떤 분은 그러더군요 개발은 Null 과의 싸움이라고,,,,,,

 

1. NullPointException의 정의

NullPointException은 클래스 또는 변수의 객체 또는 값이 null 일 때 발생하는 Runtime Exception이라고

정의 할 수 있습니다.

 

2. NullPointException 발생 원인

원한이 있지 않고서야 일부러 null을 세팅해서 NullPointException을 발생시키는 개발자는 아마 없을것입니다.

하지만 의도치않게 NullPointException이 발생합니다. 오류의 대부분이 그렇습니다.

- null이 세팅되는 경우는 의도치 않은 파라미터가 세팅되어 결과가 null이 되는경우,,, 이후 해당 객체를 이용해 프로세스를 처리할 때 NullPointException 발생

 

3. 예방

NullPointException 오류가 발생한 이후 오류를 잘 잡는것도 좋지만 애초에 NullPointException 오류가 발생하는 경우를 줄이는것이 제일 좋은 방법입니다.

- null 파라미터를 애초에 넘기지 않는다. 파라미터를 받은 후 체크해서 null에 대비하는 것도 방법이지만 이런 경우는 모두 null을 체크해줘야 하는 번거로움이 있습니다. 애초에 코딩하는 습관으로 null을 넘기지 않는것이 쓸데없이 체크하는 if 문을 줄이고 만약 null이 넘어온 경우는 의도한 값이 아니므로 오류라고 생각하고 디버깅을 할 수 있습니다.

null을 파라미터로 넘긴경우 이게 내가 넘긴 값인지 오류로 넘어온건지 일일히 체크해야 하므로 애초에 null 파라미터를 넘기지 않는것이 NullPointException을 줄일 수 있는 방법입니다.

 

- Apache Commons에서 제공하는 StringUtils 사용하기

public static void main(String[] args) {
    System.out.println(StringUtils.isEmpty(null));     //true
    System.out.println(StringUtils.equals("1", null));    //false
    System.out.println(StringUtils.equals(null, "1"));    //false
    System.out.println(StringUtils.indexOf("갓", null));    //-1
    System.out.println(StringUtils.indexOf(null, "갓"));     //-1
    System.out.println(StringUtils.upperCase(null));     //null
}
// 결과 //
true
false
false
-1
-1
null

=======================================

- 위에서 말했지만 null에 대해서 체크하는 것도 방법입니다. 하지만 어떻게 비교하느냐는 사람에 따라 다릅니다.

아래와 같은 방법으로 비교하는 것이 비교하는 과정에서 null 오류를 줄여줄 수 있습니다.

String aa = null;

System.out.println(a.indexOf("value");

>> Exception in thread "main" java.lang.NullPointerException 발생

 

>> 추천 코딩

String aa = null;
if (a != null) {
    System.out.println(a.indexOf("value"));
}

=======================================

- equlas로 비교할 때도 문자열을 먼저 적어줍니다.

String aa = null;

if(aa.equals("value"){

  System.out.println("value 가 있음");

}

>> NullPointException 발생

 

>> 추천 코딩

String aa = null;

if("value".equals(aa){

    System.out.println("value 가 있음");

}else{

    System.out.println("value 가 없음!!!!!!");

}

=======================================

- toString() 보다는 valueOf()를 사용합니다.

Integer aa = null;

System.out.println(a.toString());

>> NullPointException 오류 발생

 

>> 추천 코딩

Integer aa = null;

System.out.println(String.valueOf(aa));

=======================================

 

오류가 발생한 다음에 수정을 잘 하는것도 실력입니다. 저도 그렇게 생각합니다.

하지만 애초에 오류가 더 발생하는 코딩을 하는것이 더 좋은 방법이라고 생각합니다.

위와 같은 방법으로 애초에 오류가 덜 발생하는 방법으로 즐거운 코딩 하시기 바랍니다.

 

그럼이만.

감사합니다.