NullPointException은 자바 프로그램 뿐만 아니라 다양한 개발언어에서 자주 발생합니다. 여러가지 원인이 있을 수 있으나 거의 대부분은 객체가 제대로 생성되지 않은 경우입니다. 객체가 생성되지 않았다는 것은 프로그램을 가동시키는 VM에서 해당 하는 주소를 찾아갔을 때 아무 값도 없다는 뜻입니다. 


가령 객체 A를 생성한후 A를 참조 받아 B가 작업을 해야하는데 B가 작 하려 할 때 A가 없는 경우입니다.


1. NullPointException 발생시키기


* AClass에 string_null값이 초기화 되지 않았습니다. NULL 입니다.


 

1
2
3
4
5
6
  class AClass {
    String  string_null;
    AClass(){
        //i="1";
    }
    public String getNullString() { return string_null;}
cs


* 위 Class를 실행합니다. 변수 string_null이 값이 "1"인지 비교하려 했지만 NullpointException이 발생하며 프로그램이 죽어 버립니다.


 

1
2
3
4
5
        AClass aClass = new AClass();
        if(aClass.getNullString().equals("1")) {
            System.out.print(" 정상입니까 ? ");
        }
 
cs


[실행 결과]


* 오류가 나며 프로그램이 종료되어버립니다.


 

1
2
3
4
5
6
7
8
9
10
Exception in thread "main" java.lang.NullPointerException
    at Main.main(Main.java:14)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
 
Process finished with exit code 1
 
cs


2. 오류 피하기


NPE를 피하는 방법은 여러가지가 있습니다. 주로 객체를 생성하고 참조할 때는 Null을 Return하지 않고 부득이 하게 참조하는 경우는 Null이 발생할 경우를 대비하는 코딩을 하시면 됩니다.


1) 비교할 문자열을 먼저 넣고 코딩하면 오류가 발생하지 않습니다.

 

1
2
3
      if(("1").equals(aClass.getNullString())) {
            System.out.print(" 정상입니다!");
        }
cs


2)  String 객체의 경우 toString 보다는 String.valueOf 메소를 사용하세요.

 

1
2
3
4
5
        // NullPointException 오류 발생 !
        System.out.printf("i = %s \n", aClass.getNullString().toString());
        // NullPointException 미발생 !
        System.out.printf("i = %s \n"String.valueOf(aClass.getNullString()));
 
cs

 


3) try catch 구문을 사용

* NullPointException의 에외를 처리합니다.

 

1
2
3
4
5
6
        try {
            System.out.printf("i = %s \n", aClass.getNullString().toString());
 
        } catch (NullPointerException npe) {
            System.out.println(" Null Opint Exception!!");
        }
cs


4) null인지 비교합니다.

 

1
2
3
4
5
        if(aClass.getNullString() != null) {
            System.out.printf("i = %s \n", aClass.getNullString().toString());
        } else {
            System.out.println(" Null Opint Exception!!");
        }
cs


5) Apache Common 유틸을 사용하여 코딩을 합니다.

* 패키지 : org.apache.commons.lang3.StringUtils

* marven을 이용하여 jar를 추가하시면 쉽게 사용하실 수 있습니다.


 

1
2
3
4
5
6
7
8
  //Apache Common의 StringUtil사용
        if(StringUtils.equals(aClass.getNullString(),"1")) {
            System.out.println(" StringUtil Use");
        }
 
        String a =StringUtils.defaultString(aClass.getNullString(),"기본값!");
 
        System.out.printf("i = %s \n", a);
cs



[요약]

NPE는 많은 경우에 발생할 수 있습니다. String Object 말고도 여러 Array,File 등 객체가 제대로 생성되지 않고 참조하는 경우가 제법 많습니다.이러한 오류를 해결하는 근본 습관이 있습니다. 가령 Server에서 데이터를 받아와야 동작하는 프로그램을 만들 때라면 데이터를 못받는 경우를 가정하고 프로그램을 설계하시면 오류를 많이 줄 일 수 있습니다.











출처: https://m.blog.naver.com/sangrime/220627761646


'Development > JAVA' 카테고리의 다른 글

Tomcat memory leak 현상  (1) 2019.03.23

+ Recent posts