[개발 일기]NPE를 예방하는 방법

Posted by 열정보이
2019. 5. 28. 19:37 개발 일기

 

회사에서 코딩을 하다 보니, 아래와 같이 코딩된 소스를 본적이 있었다.

 

 

 if("TEST".equals(str)) {
   ...			
 }else {
   ...		
 }

 

 

학교에서 JAVA를 배울때는 객체명.equals("TEST") 로 배웠는데 아니 이게 뭐람....

하지만 곧 찾아보니 알게된 사실..!

 

위와 같이 코딩을 할 경우 str이 null이더라도, NPE(NullPointerException)을 피할 수 있다.

실제 코드를 보자.

 

 

 public class StringTest {
	public static void main(String[] args) {
		
		String str = null;
		if(str.equals("TEST")) {
			System.out.println("NPE");
		}
	}
 }

 

 

결과는 어떨까?

str이라는 참조변수에는 할당된 인스턴스가 없기 때문에 equals 메서드를 사용할 수 없어 NPE가 발생한다.

 

하지만 반대라면?

 

 

 public class StringTest {
	public static void main(String[] args) {
		
		String str = null;
		if("TEST".equals(str)) {
			System.out.println("NPE");
		}
	}
 }

 

 

JAVA에서 "TEST" 와 같이 문자열을 선언하게 되면 컴파일 시, 인스턴스를 할당하기 때문에 equals 메서드를 사용할 수 있어 NPE를 회피할 수 있다.

하지만 찾아본 결과 많은 사람들이 사용하고 있으면서도, 많은 사람들이 추천하지는 않는다고 한다.

 

가장 많았던 이유는 "가독성" 이야기를 많이 한다.

하긴 눈에 안띄는건 사실이다.

그래서 다음과 같이 코드를 짜라고 한다.

 

 

 public class StringTest {
	public static void main(String[] args) {
		
		String str = null;
		if(str != null && str.equals("TEST")) {
			System.out.println("NPE");
		}
	}
 }

 

 

먼저 str 변수가 null 인지 아닌지 체크를 해준다면 순조롭게 패스~

그러나 if문이 else if로 길어질 경우 조건이 헷갈릴 수 있으니 그냥 나는

아래처럼 작성하기로 하였다...

 

 

 public class StringTest {
	public static void main(String[] args) {
		
		String str = null;
		if(str != null) {
			if(str.equals("TEST")) {
				System.out.println("NPE");
			}			
		}
	}
 }

 

 

초보 개발자의 개발일기 끝...!