NullPointerException

Elenaljh·2023년 7월 21일
0

토막지식

목록 보기
3/5

NullPointerException(NPE) 정의

null 때문에 발생하는 Runtime Exception

NPE가 문제인 이유

  • null 자체의 의미가 모호해 다양한 파생 에러가 발생함
  • 에러 발생 이후 디버깅이 매우 어렵다.
  • 따라서 NPE를 예방할 수 있도록 개발 초기 단계에서부터 신경을 써야 한다.

예방 및 해결방법

1. null parameter를 넘기지 말자

  • 의미없는 null은 파라미터로 넘기지 않는다.
    • 강의에서 강사님이 Optional로 감싼게 이래서인가보다.

2. null 여부 비교 처리 추가

  • 대부분의 개발자들이 NPE 예방을 위해 사용하고 있는 방법이다.
String inNull = null;
if(isNull != null){
	System.out.println(isNull.indexOf("갓"));
}

3. 문자열 비교

문자열.equals(null일 가능성이 있는 객체) 형태로 비교한다.

참고

  • String 문자열은 기본형이 아니라 객체이기 때문에 equals 메서드로 비교한다
  • Null은 객체가 아니기 때문에 equals 메서드가 없다.
public static void main(String[] args) {

	String a = null;

	//정상작동
    if ("god".equals(a)) {
    	System.out.println("참");
    } else {
    	System.out.println("거짓");  //거짓 출력
    }

	// NPE 발생
	if (a.equals("god")) { // NPE 발생! 
		System.out.println("참");
	} else {
		System.out.println("거짓");
	}
}

똑같이 문자열을 비교하는 코드이지만 첫번째 코드는 정상작동하고, 두번째 코드는 NPE를 던진다.
순서만 바꿔도 NPE를 피할 수 있다.

4. toString() 대신 valueOf() 사용

Integer a = null;

//NPE 발생
System.out.println(a.toString());

//정상동작: null 출력
System.out.println(String.valueOf(a));

5. Chaining 메소드 호출 자제하기

패턴: 메소드 체이닝(Method Chaining)이란?
객체.메소드().메소드().메소드();와 같은 구조
자바스크립트에서 많이 본 것 같다.

작성 코드량이 현저하게 줄어든다는 장점이 있지만 체이닝 메소드에서 NPE가 발생하면 디버깅하기가 매우 어렵다.

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

org.apache.commons.lang.StringUtils 라이브러리에서 제공하는 기능을 사용하면 NPE 발생을 막을 수 있다.

7. 스프링 사용시 @NotNull 사용

자기도 모르게 Null을 넘기는 상황에 대비해 Domain(DTO, model)에 @NotNull 어노테이션을 지정한다.

출처

https://goddaehee.tistory.com/126

+질문: build.gradle에서

test {
	useJUnitplatform()
}
tasks.named('test') {
	useJUnitplatform()
}

차이

0개의 댓글