的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; 
} 

这对我来说意味着空以某种方式放置在阵列中。任何人都曾遇到过这个?

+0

'addressables'已经包含了'null'。在那里检查。 – Henry

+0

Null是一个有效的列表值 – Mike

+1

找出为什么你的序列包含一个空元素并修复_that_问题。对于序列不包含空元素的情况,可以用Comparator.nullsFirst或Comparator.nullsLast(假设Java 8或更高版本)封装“Comparator”。请注意,Comparator实现不需要支持空值,所以如果这是你想要处理的事情,你应该使用前面提到的包装器之一。 –

这意味着你需要检查o2的参考。它可能为空。在从o2.getAddress获取地址之前,首先检查o2 == null

是的,您可以在数组列表中包含空元素。

试试这个:

final ArrayList<Object> list = new ArrayList<Object>(); 
list.add(null); 

所以,如果你不能保证你将永远有有效的对象,更改您的代码

if (o2 == null || o2.getAddress() == null) { 
    return 0; 
}