在 Java 中,Comparator 为空(null)通常不是“Comparator 本身会自动变成 null”,而是你在使用或定义 Comparator 的地方没有正确赋值或传入。下面从常见场景和原因给你系统说明。
Comparator<Integer> comparator;
// 此时 comparator == null
如果你直接拿来用:
list.sort(comparator); // NullPointerException
✅ 正确写法:
Comparator<Integer> comparator = (a, b) -> a - b;
List<Integer> list = new ArrayList<>();
list.sort(null); // 允许(使用自然排序)
TreeSet<Integer> set = new TreeSet<>(null); // ❌ 会抛 NullPointerException
⚠️ 注意:
List.sort(null) ✅ 合法(使用 Comparable)TreeSet / PriorityQueue(null) ❌ 会报错public Comparator<String> getComparator() {
return null;
}
list.sort(getComparator()); // NullPointerException
✅ 建议:
public Comparator<String> getComparator() {
return Comparator.naturalOrder();
}
Comparator 类本身Comparator<String> c = Comparator.nullsFirst(); // ❌ 编译错误
正确:
Comparator<String> c = Comparator.nullsFirst(Comparator.naturalOrder());
Collections.sort(list); // 使用 Comparable
Collections.sort(list, null); // ✅ 等价
但:
list.sort(null); // ✅
new TreeSet<>(null); // ❌
if (comparator == null) {
// 使用自然排序
}
或安全写法:
list.sort(comparator != null ? comparator : Comparator.naturalOrder());
Java 的 Comparator 不会“自动为空”,为空一定是因为:没赋值、没传参、或方法返回了 null。
如果你愿意,可以把具体报错代码贴出来,我可以直接帮你定位是哪一行导致的 null。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。