null 때문에 발생하는 Runtime Exception
String inNull = null;
if(isNull != null){
System.out.println(isNull.indexOf("갓"));
}
문자열.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를 피할 수 있다.
Integer a = null;
//NPE 발생
System.out.println(a.toString());
//정상동작: null 출력
System.out.println(String.valueOf(a));
패턴: 메소드 체이닝(Method Chaining)이란?
객체.메소드().메소드().메소드();
와 같은 구조
자바스크립트에서 많이 본 것 같다.
작성 코드량이 현저하게 줄어든다는 장점이 있지만 체이닝 메소드에서 NPE가 발생하면 디버깅하기가 매우 어렵다.
org.apache.commons.lang.StringUtils
라이브러리에서 제공하는 기능을 사용하면 NPE 발생을 막을 수 있다.
자기도 모르게 Null을 넘기는 상황에 대비해 Domain(DTO, model)에 @NotNull 어노테이션을 지정한다.
https://goddaehee.tistory.com/126
test {
useJUnitplatform()
}
tasks.named('test') {
useJUnitplatform()
}
차이