1. NPE

1-1. NPE는 null로 인하여 발생하는 Runtime Exception이다.

1-2. null 유발에 대한 고찰

개발하다 보면 객체의 null에 대한 가능성을 고려해야 하는 경우가 생긴다.

예제 코드로 이러한 경우를 확인하고 해결 방법을 생각해 보자.

2. 실습

null의 발생 경우는 매우 광범위 하고 전부를 다룰 수 없기 때문에 이번 실습은 String 위주로 진행한다.

2-1. NPE 유발

  • 배열 이나 오브젝트 등에서 null의 가능성을 배제한 함수 호출을 한다.
  • null에는 toString()이라는 함수가 존재하지 않으며 NPE를 유발한다.
//Case.1
String[] arrStr = new String[2];
arrStr[0] = "arr1";
arrStr[1].toString(); //null.toString();

//Case.2
Map<String, String> map = new HashMap<String, String>();
map.put("id", "admin");
map.put("pwd", null);
map.get("pwd"); //null.toString();
map.get("name"); //null.toString();

//Case.3
public Object getObj(){
	Object obj = null;
	return obj;
}
Object obj = getObj();
obj.toString(); //null.toString();

2-2. NPE 예방

  • null 가능성을 배제할 수 있는 구조를 사용.
//obj에 null의 가능성이 존재
//Case.1 : null.equals() NPE 유발 가능성 발생
if(obj.toString().equals("str")){
	return false;
}
//Case.2 : "str"은 문자열로 equals() 함수 사용이 가능
//obj.toString()에 NPE가능성이 존재하지만 equals()의 NPE 배제의 예제
if("str".equals(obj.toString())){
	return true;
}
  • null을 피할 수 있는 함수의 활용.
obj.String(); //null.toString();
//null처리된 String객체의 함수 활용하여 위 Case.2의 문제를 해결
if("str".equals(String.valueOf(obj))){
	return true;
}
  • try-catch의 활용

Exception(예외)는 에러가 아니다. NPE의 발생을 로그나 메시지처리로 핸들링해 보자.

try{
	obj.toString();
} catch(NullPointerException npe){
	"NPE예외를 핸들링 해보자"
}

3.결론

3-1. String외에도 배열, File 등 객체를 생성할 때 모종의 이유로 null인 상태에서 함수 사용 등 참조하면 NPE를 발생시킬 수 있다.

3-2. NPE의 예방은 null을 피하기 위한 노력, 코딩 습관이라고도 할 수 있으니 예제 외에도 NPE를 피할 방법을 계속해서 고민하자.

+ Recent posts