2017-10-19 2 views
-2

J'ai cette fonction: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; 
      } 

     } 
    }); 

Pour une raison quelconque, je continue à obtenir un NPE sur:

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

Ce qui me signifie que nulle était en quelque sorte placé dans le tableau. Quelqu'un a déjà rencontré ça avant?

+0

'addressables' contient déjà le' null'. Vérifiez là. – Henry

+0

Null est une valeur de liste valide – Mike

+1

Découvrez pourquoi votre séquence contient un élément null et corrige le problème _that_. Pour les cas où il n'est pas exceptionnel qu'une séquence contienne des éléments NULL, vous pouvez envelopper votre Comparator avec Comparator.nullsFirst ou Comparator.nullsLast (en supposant Java 8 ou plus récent). Notez que les implémentations 'Comparator' ne sont pas requises pour prendre en charge les valeurs nulles, donc si c'est quelque chose que vous voulez gérer, vous devriez utiliser l'un des wrappers précités. –

Répondre

1

Cela signifie que vous devez vérifier la référence o2. Cela peut être nul. Avant d'obtenir l'adresse de o2.getAddress, vérifiez d'abord o2 == null

1

Oui, vous pouvez avoir des éléments Null dans votre liste de tableaux.

Essayez ceci:

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

Donc, si vous ne pouvez pas garantir que vous aurez toujours des objets valides, changer votre code pour

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