오늘 개발을 하다보니 String인 인자를 전달해서 문자열을 만들어야 했다.

 

String folder = null;

String path = "E:\" + folder;

System.out.println(path);

위와 같이 코드를 작성한다고 할 때, 콘솔에 찍히는 값은 `E:\`가 아니라 `E:\null`이다.

 

Java 컴파일러는 문자열 `+`연산을 `StringBuilder`로 변환한다. 컴파일 후 내부적으로 아래와 같은 코드가 된다.

String path = new StringBuilder().
	.append("E:\")
	.append(folder)
	.toString();

 

`StringBuilder.append(String str)` 내부 구현을 보면 

public AbstractStringBuilder append(String str) {
	if(str == null)
    	return appendNull();
    ...

위와 같고

 

private AbstractStringBuilder appendNull() {
    append("null");
}

즉, null이면 `"null"` 문자열을 붙이도록 설계되어 있다. 의도하지 않는 null 체크가 이미 내부에서 처리된다.

 

백엔드 개발에서 로그나 응답 문자열 만들 때 자주 발생한다.

 

방법 1 - Optional 사용

String path = "E:\" + Optional.ofNullable(folder).orElse("");

 

방법 2 - Objects.toString()

String path = "E:\" + Objects.toString(folder,"");

 

방법 3 - null 체크

String path = "E:\" + (folder == null ? "" + folder);

 

아무튼 로그 안찍어 봤으면 null이 그대로 들어가 큰일날 뻔 했다.

+ Recent posts