-
[Java] List 에서 ObjectUtils.isEmpty() 를 이용한 null 체크(isEmpty(), != null)Programming/Java 2022. 4. 1. 17:10
List 를 사용하여 데이터를 조회하다 보면, 조회된 데이터가 없을 경우 NullPointerException 등이 터질 수 있기 때문에 null 체크를 해주어야 합니다.
1. List 가 null 일 경우
인스턴스 자체가 생성되지 않았을 경우 List 는 null 값을 가진다. null 인 리스트를 조회하려고 하면, NullPointerException 이 터진다. null 체크는 "list == null" 로 할 수 있다.
if(list != null){ // task }
위 코드를 추가하면, list 가 null 이 아닌 경우에만 작업을 수행한다. 다만, 여전히 문제가 있다. 데이터를 받아오는 과정에서 list 에 null 이 아닌 빈 값이 저장되는 경우 위의 null 체크에 걸리지 않는다. (list == [])
2. List 가 빈 값인 경우(list == [])
데이터를 조회하여 List 에 넣어주는 경우 List 에 [] 빈 값이 들어가는 경우가 있다. 이 경우 java.util.List 에서 제공하는 isEmpty() 메소드를 사용하여 체크할 수 있다.
if(list != null && !list.isEmpty()){ // task }
이 경우, isEmpty() 전에 null 체크를 선행해주어야 한다. null 인 List 에 isEmpty() 메소드를 수행하면 NullPointerException 이 발생하기 때문이다. (마찬가지로, size() 메소드를 호출하는 경우에도 List 가 null 경우 NullPointerException 이 발생하기 때문에 null 체크가 필요하다.)
3. ObjectUtils.isEmpty()
org.springframework.util 라이브러리에서 제공하는 ObjectUtils.isEmpty() 를 사용하면 null 체크와 빈 문자열 체크를 동시에 할 수 있다.
if(ObjectUtils.isEmpty(list)){ // task }
코드를 살펴보면 내부적으로 null 체크와 isEmpty() 를 동시에 수행한다.
// ObjectUtils public static boolean isEmpty(@Nullable Object obj) { if (obj == null) { return true; } else if (obj instanceof Optional) { return !((Optional)obj).isPresent(); } else if (obj instanceof CharSequence) { return ((CharSequence)obj).length() == 0; } else if (obj.getClass().isArray()) { return Array.getLength(obj) == 0; } else if (obj instanceof Collection) { return ((Collection)obj).isEmpty(); } else { return obj instanceof Map ? ((Map)obj).isEmpty() : false; } }
Collection 에 한정하여 사용할 수 있는 CollectionUtils.isEmpty() 도 있다.
// CollectionUtils public static boolean isEmpty(@Nullable Collection<?> collection) { return collection == null || collection.isEmpty(); }
내부적으로 null, isEmpty() 를 수행하는 것은 동일하다.
정리
NullPointerException 을 피하기 위해서 CollectionUtils.isEmpty(), ObjectUtils.isEmpty() 을 사용하는 것이 가장 좋아보인다.