BufferedReader로 입력 받을 때 NPE 방지하기

https://www.acmicpc.net/problem/5639

 

5639번: 이진 검색 트리

트리를 전위 순회한 결과가 주어진다. 노드에 들어있는 키의 값은 106보다 작은 양의 정수이다. 모든 값은 한 줄에 하나씩 주어지며, 노드의 수는 10,000개 이하이다. 같은 키를 가지는 노드는 없다

www.acmicpc.net

최근 이 문제를 풀었고, 코드가 분명 이클립스 IDE에서는 잘 돌아갔는데 제출만 하면 RuntimeError - NullPointerException이 떴다.

죽어라 봐도 모르겠어서 결국 다른 분 블로그의 답을 확인했는데, 다른 부분은 전부 같고

 

//내 코드

if (temp.equals("") || temp == null) {
    // temp가 null이거나 빈 문자열인 경우 실행될 코드
}
//답안 코드

if (temp == null || temp.equals("")) {
    // temp가 null이거나 빈 문자열인 경우 실행될 코드
}

 

이 부분만 달랐다. 즉, null과 비교하느냐, 객체의 내용이 비어있느냐를 검사하는 순서만 달랐다.

 

 


 

 

BufferedReader의 readLine() 메서드는 더 이상 입력받는/읽을 데이터가 없을 때 null값을 반환한다.

 

equals() 메서드는 객체를 비교할 때 사용된다.

하지만 null은 객체가 아니므로 내 코드처럼 temp.equals("") 를 먼저 조사할 경우, NPE가 발생하게 된다.

 

따라서 null 일때와 비어있을 때를 모두 조사하기 위해서는 temp==null 조건을 먼저 검사하고 temp.equals("") 비교를 수행하는 것이 안전하다.

 

//답안 코드

if (temp == null || temp.equals("")) {
    // temp가 null이거나 빈 문자열인 경우 실행될 코드
}

이 경우 temp가 null일 경우, 뒤의 temp.equals("") 조건은 검사하지 않고 바로 if 블록으로 집입한다.

'Java > 문법, 자료구조, 알고리즘' 카테고리의 다른 글

@Builder.Default  (0) 2023.04.16
Builder 패턴과 @Builder 어노테이션  (0) 2023.04.15
Tree, BinaryTree  (0) 2023.04.02
PriorityQueue  (0) 2023.04.01
== 와 .equals() 차이  (0) 2023.03.28