的Android - Collections.sort - 显示java.lang.NullPointerException
问题描述:
我有这样的功能:的Android - Collections.sort - 显示java.lang.NullPointerException
final ArrayList<Addressable> tempStoreList = new ArrayList<>();
tempStoreList.addAll(addressables);
Collections.sort(tempStoreList, new Comparator<Addressable>() {
@Override
public int compare(Addressable o1, Addressable o2) {
double distanceToO1 = 0;
double distanceToO2 = 0;
if (o1.getAddress() == null) {
return (o2.getAddress() == null) ? 0 : -1;
}
if (o2.getAddress() == null) {
return 0;
}
if (userLocation != null && o1.getAddress() != null && o2.getAddress() != null) {
distanceToO1 = GlobalUtilities.distance(userLocation, o1.getAddress().getLocation(), "K");
distanceToO2 = GlobalUtilities.distance(userLocation, o2.getAddress().getLocation(), "K");
}
if (distanceToO1 < distanceToO2) {
return -1;
} else if (distanceToO1 > distanceToO2) {
return 1;
} else {
return 0;
}
}
});
出于某种原因,我不断收到一个NPE:
if (o2.getAddress() == null) {
return 0;
}
这对我来说意味着空以某种方式放置在阵列中。任何人都曾遇到过这个?
答
这意味着你需要检查o2的参考。它可能为空。在从o2.getAddress获取地址之前,首先检查o2 == null
答
是的,您可以在数组列表中包含空元素。
试试这个:
final ArrayList<Object> list = new ArrayList<Object>();
list.add(null);
所以,如果你不能保证你将永远有有效的对象,更改您的代码
if (o2 == null || o2.getAddress() == null) {
return 0;
}
'addressables'已经包含了'null'。在那里检查。 – Henry
Null是一个有效的列表值 – Mike
找出为什么你的序列包含一个空元素并修复_that_问题。对于序列不包含空元素的情况,可以用Comparator.nullsFirst或Comparator.nullsLast(假设Java 8或更高版本)封装“Comparator”。请注意,Comparator实现不需要支持空值,所以如果这是你想要处理的事情,你应该使用前面提到的包装器之一。 –