Java List null check
프로젝트를 진행하다 보면 List를 활용하는 부분에서 NullPointerException이 발생하는 경우를 생각보다 자주 접할 수 있는데요.
아래 내용은 java에서 list에 대한 null 체크를 하는 몇 가지 방법에 대해서 정리한 것입니다.
List.isEmpty(), List.size()
- isEmpty()
//Returns true if this list contains no elements
boolean isEmpty();
List interface의 isEmpty() 메서드는 해당 리스트 객체가 아무런 요소도 가지고 있지 않을 때(리스트가 비어있을 때) true를 반환합니다.
//NullPointerException 발생
List<String> list = null;
if (list.isEmpty()) {
...
}
//NullPointerException 발생을 막기 위해 null 여부를 함께 확인
List<String> list = null;
if (list == null || list.isEmpty()) {
...
}
하지만 위 코드와 같이 List 객체가 null 일 경우 isEmpty() 메서드 호출 시 NullPointerException이 발생하기 때문에 리스트가 null 인지 여부도 함께 확인해야 합니다.
- size()
//Returns the number of elements in this list.
//if this list contains more than Integer.MAX_VALUE elements, returns Integer.MAX_VALUE.
int size();
List interface의 size() 메서드는 해당 리스트의 요소 개수를 반환합니다.
만약 리스트가 비어 있을 경우 0을 반환하며, 요소의 수가 Integer.MAX_VALUE(2,147,483,647) 보다 많을 경우 Integer.MAX_VALUE를 반환하는데요. 때문에 해당 리스트의 사이즈가 0인지 여부를 판단하여 리스트가 비어있는지 확인할 수 있습니다.
//NullPointerException 발생
List<String> list = null;
if (list.size() == 0) {
...
}
//NullPointerException 발생을 막기 위해 null 여부를 함께 확인
List<String> list = null;
if (list == null || list.size() == 0) {
...
}
하지만 isEmpty()의 경우와 마찬가지로 List 객체가 null 일 경우 size() 메서드 호출 시 NullPointerException이 발생하기 때문에 리스트가 null 인지 여부도 함께 확인해야 합니다.
List interface에는 다음과 같이 List.isEmpty(), List.size() 메서드를 통해 해당 리스트가 비어있는지 여부를 확인할 수 있는데요.
'비어있는지' 여부를 확인하는 것이 목적이라면 isEmpty() 메서드를 사용하는 것이 size() 메서드를 통한 확인보다 코드상으로 더 직관적이지 않을까 하는 개인적인 생각입니다.
***
List가 null이라는 것은 해당 인스턴스가 생성되지 않았다는 것(메모리에서 참조하는 주소값이 없는 상태)을 의미하며, isEmpty()와 size() == 0은 해당 인스턴스는 생성된 상태이지만 List 내부의 요소가 존재하지 않는다는 것을 의미합니다.
CollectionUtils.isEmpty()
//Return true if the supplied Collection is null or empty. Otherwise, return false;
public static boolean isEmpty(@Nullable Collection<?> collection) {
return (collection == null || collection.isEmpty());
}
//Return true if the supplied Map is null or empty. Otherwise, return false;
public static boolean isEmpty(@Nullable Map<?, ?> map) {
return (map == null || map.isEmpty());
}
(org.springframework.util package CollectionUtils class)
스프링 프레임워크를 사용하는 경우 org.springframework.util 패키지의 CollectionUtils.isEmpty() 메서드를 사용할 수도 있는데요.
해당 메서는 인자로 전달된 객체가 null이거나 empty일 때 true를 반환합니다.
CollectionUtils.isEmpty()의 내부 구현 코드를 살펴보면, null 여부 확인과 함께 isEmpty() 메서드가 사용되는 것을 볼 수 있습니다.
때문에 해당 메서드를 사용할 경우 내부적인 동작 과정은 같지만 코드가 간결해진다는 장점이 있습니다.
***
Apache Commons 라이브러리에도 CollectionUtils.isEmpty() 메서드가 존재하는데요.
해당 기능을 사용할 경우 외부 라이브러리를 추가해서 사용해야 하기 때문에 우선적으로 고려되지는 않습니다.
'Programming > Java' 카테고리의 다른 글
Java 8, 11, 17 버전별 추가된 기능 (+ 무슨 버전을 써야할까?) (0) | 2023.07.05 |
---|---|
java ip 접속 국가 정보 확인하기(GeoIP2, GeoLite2) (0) | 2023.06.29 |
java stream partitioningBy(), groupingBy() 분할과 그룹화 (0) | 2023.05.24 |
ConcurrentHashMap 개념과 동기화 동작 원리(Thread-safe) (0) | 2023.05.21 |
(java) 어플리케이션 단계에서 외부 이미지 파일 불러오는 방법 (0) | 2023.03.01 |