为什么Collections.sort(dateList,Collections.reverseOrder())抛出NPE

时间:2019-02-22 13:39:33

标签: java list sorting java-8

当我尝试这样做时:

if (serviceEndDateList != null && !serviceEndDateList.isEmpty()) {
    LOG.info("serviceEndDateList::"+serviceStartDateList);
    Collections.sort(serviceEndDateList, 
    Collections.reverseOrder());
}

我低于堆栈跟踪:

java.lang.NullPointerException
at java.util.Collections$ReverseComparator.compare(Collections.java:5117)[:1.8.0_181]
at java.util.Collections$ReverseComparator.compare(Collections.java:5108)[:1.8.0_181]
at java.util.TimSort.countRunAndMakeAscending(TimSort.java:355)[:1.8.0_181]
at java.util.TimSort.sort(TimSort.java:220)[:1.8.0_181]
at java.util.Arrays.sort(Arrays.java:1512)[:1.8.0_181]
at java.util.ArrayList.sort(ArrayList.java:1462)[:1.8.0_181]
at java.util.Collections.sort(Collections.java:175)[:1.8.0_181]

日志的输出为:

serviceEndDateList::[2001-05-17]
serviceEndDateList::[2001-05-17, 2001-05-17]

由于对象不为null,为什么会引发此异常!

1 个答案:

答案 0 :(得分:1)

问题是您的输入列表serviceEndDateList包含一个null值的可能性最高,该值会导致比较麻烦。

您必须定义null值将包含在集合的开头还是结尾。在这种情况下,请使用特殊包装器将所有null的值推到末尾:

Collections.sort(serviceEndDateList, Comparator.nullsLast(Comparator.reverseOrder()));

Comparator JavaDoc(强调我的):

  • Comparator::nullsFirst是一个比较器,它认为null比非null小 ,并将非null对象与提供的Comparator进行比较。
  • li>
  • Comparator::nullsLast是一个比较器,它认为null比非null大 ,并将非null对象与提供的Comparator进行比较。
  • li>