본문 바로가기

Development/Java

[JAVA] 정렬할 때 NullPointerException 방지 - Comparator.nullsLast() 활용

728x90

main

 

null 값이 포함된 Collection을 정렬할 때, 제대로 처리하지 않으면 NullPointerException이 발생될 수 있습니다.

Java 8에서 이 문제를 해결하기 위한 편리한 메서드 Comparator.nullsLast()가 있습니다. 이 메서드를 사용하면 정렬 작업 중 null 값을 처리 가능합니다.

Java에서 정렬할 때 NullPointerException을 방지하기 위해 Comparator.nullsLast()를 어떻게 사용하는지 알아보겠습니다.

문제 상황

적절한 예외 처리 없이 null 값이 포함된 목록을 정렬해 보는 간단한 예제를 만들어 보겠습니다.

List<String> strings = new ArrayList<>();
strings.add("BB");
strings.add("AA");
strings.add(null);
strings.add("EE");
strings.add("DD");

Collections.sort(strings);

 

위 코드에서 Collection.sort()는  정렬 중에 null 요소를 만나게 됩니다. null은 String의 자연스러운 순서를 사용하여 비교할 수 없기 때문에 NullPointerException을 throw 합니다.

위 코드를 실행하면 다음과 같은 예외가 발생합니다.

Exception in thread "main" java.lang.NullPointerException
    at java.util.ComparableTimSort.countRunAndMakeAscending(ComparableTimSort.java:325)
    at java.util.ComparableTimSort.sort(ComparableTimSort.java:188)
    at java.util.Arrays.sort(Arrays.java:1312)
    at java.util.Arrays.sort(Arrays.java:1506)
    at java.util.ArrayList.sort(ArrayList.java:1464)
    at java.util.Collections.sort(Collections.java:143)
    at Main.main(Main.java:14)

 

이 예외는 Collections.sort()의 기본 정렬 동작이 모든 정렬된 요소가 Comparable이고 null이 유효한 Comparable 객체가 아니라고 가정하기 때문에 발생됩니다.

이젠 정렬 중에 null 값을 우아하게 처리하기 위해 Comparator.nullsLast()를 사용하는 솔루션을 알아보겠습니다.

Comparator.nullsLast() 사용

Comparator.nullsLast() 메서드는 Java 8에서 도입된 Comparator 인터페이스의 일부입니다. 객체를 정렬할 때 null 값을 null이 아닌 값 보다 큰 것으로 간주하고 비교자를 반환합니다. 이는 null 일 수 있는 필드를 기준으로 객체 컬렉션을 정렬하여 null 값이 정렬된 목록의 끝에 위치하도록 할 때 특히 유용합니다.

null  값을 포함하는 문자열 목록의 실제 예를 고려해 보겠스빈다.

List<String> strings = new ArrayList<>();
strings.add("DD");
strings.add("BB");
strings.add(null);
strings.add("AA");
strings.add("EE");

 

따라서 목록을 만든 후 Comparator<String>을 만들고 Comparator.nullsLast(Comparator.naturalOrder())를 사용하여 문자열 객체를 자연스로운 순서로 저장하면서 null 값을 모든 null이 아닌 값 보다 큰 값으로 처리합니다.

Comparator<String> nullsLastComparator = Comparator.nullsLast(Comparator.naturalOrder());

 

그런 다음 Collections.sort()를 적용하면 목록이 정렬되고 정렬된 목록의 끝에 null값이 배치됩니다.

Collections.sort(strings, nullsLastComparator);

 

그 결과, null 값을 포함할 수 있는 컬렉션을 처리할 때 정렬 동작이 더 예측 가능해지고 정렬 기준에 따라 일관된 순서가 유지됩니다.

 

결론

단순 sort도 null인한 고통을 받을 수 있으니, Collection 데이터에 null이 포함될 것 같은 유형은 정렬 시Comparator.nullsLast() 메서드를 활용하여 NullPointerException이라는 NPE 지옥에서 한걸은 물러나 보자.

 

 

전체코드

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class CollectionAvoidNullPointException {
    public static void main(String[] args) {
        List<String> strings = new ArrayList<>();
        strings.add("BB");
        strings.add("AA");
        strings.add(null);
        strings.add("EE");
        strings.add("DD");
        
		// NullPointerException 발생 - 아래 코드로 수정
        // Collections.sort(strings);
        
        Comparator<String> nullsLastComparator = Comparator.nullsLast(Comparator.naturalOrder());
        Collections.sort(strings, nullsLastComparator);
        System.out.println(strings); // [AA, BB, DD, EE, null]
    }
}

 

 

 

 

 

 

출처: https://www.baeldung.com/java-comparator-nullslast-avoid-nullpointerexception

728x90
반응형