[fix] Java NullPointerException ComparableTimSort countRunAndMakeAscending when sorting a List

Comparable NullPointerException

If you are trying to sort a List say ArrayList of a custom class and have that class implement a Comparable interface you may run into NullPointerException with ComparableTimSort if you have a null object in your list.

Example:
import java.util.*;

/**
 *
 * Code2care.org Java Examples
 *
 * Date: 14 Jun 2022
 * Version: v1
 * Author: Code2care
 *
 */
public class ComparableExampleJava {

    public static void main(String[] args) {

        Employee e1 = new Employee(1, "Sam");
        Employee e2 = new Employee(3, "James");
        Employee e3 = new Employee(2, "Adam");

        List<Employee> empList = new ArrayList<>();
        empList.add(e1);
        empList.add(e2);
        empList.add(null);  //Null Object
        empList.add(e3);

        Collections.sort(empList);
    }
}

class Employee implements Comparable<Employee> {

   private int eid;
    private String eName;

    Employee(int eid, String eName) {
        this.eid = eid;
        this.eName = eName;
    }

    @Override
    public int compareTo(Employee employee) {
        if(employee.eid == this.eid) return 0;
        else if(employee.eid >= this.eid) return 1;
        else return -1;
    }
}
Error Stacktrace:
Exception in thread "main" java.lang.NullPointerException
	at java.util.ComparableTimSort.countRunAndMakeAscending(ComparableTimSort.java:321)
	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 EqualsExampleJava.main(ComparableExampleJava.java:26)
Fix/Solutions:

These are some work-arounds,

  • Make sure that null's are not a part of the list, you can filter them.
  • If the list is a collection of String, you might replace null with an empty string.


Frequently Asked Questions (FAQ)

  • Q: Why does ComparableTimSort throw NullPointerException?

    A: ComparableTimSort throws NullPointerException when it encounters null elements in the list being sorted, as it cannot compare null with non-null objects.

  • Q: How can I prevent NullPointerException when sorting a list with null elements?

    A: You can prevent NullPointerException by either removing null elements before sorting or by handling null comparisons in your compareTo method.

  • Q: Is it better to remove nulls or handle them in compareTo?

    A: It depends on your use case. Removing nulls is simpler and often preferred if null elements are not needed. Handling nulls in compareTo allows you to keep and sort null elements if required.

Comments & Discussion

Facing issues? Have questions? Post them here! We're happy to help!