2016-08-07 1 views
0

Je continue d'obtenir un nullpointerexception lorsque j'essaie de trier les utilisateurs où un certain utilisateur a une valeur nulle dans son profil. J'étais sous l'impression Google Collection gérerait ces valeurs nulles, mais cela ne semble pas fonctionner.Impossible de trier null avec le comparateur

C'est le code que j'utilise:

Comparator<UserModel> firstName_comparator = new Comparator<UserModel>() { 
    @Override 
    public int compare(UserModel c1, UserModel c2) { 
     return c1.getProfile().getFirstName().toLowerCase() 
       .compareTo(c2.getProfile().getFirstName().toLowerCase()); 
     } 
}; 
Collections.sort(users, Ordering.from(firstName_comparator).nullsLast()); 

Cette ligne spécifique lance le nullpointerexception:

.compareTo(c2.getProfile().getFirstName().toLowerCase()); 

Son parce getProfile() est nulle.
Comment puis-je résoudre ce problème? Je veux être capable de trier mes utilisateurs avec des valeurs nulles.

+0

Je ne comprends pas comment c'est un doublon à cette question. Je demandais (peut-être pas directement) comment le réparer (si possible) avec Google Collection –

Répondre

2

Non, Gava n'ignorera pas votre exception NullPointerException. Vous fournissez un comparateur, et ce comparateur est supposé respecter le contrat de comparaison. Lancer NullPointerException ne fait pas partie du contrat.

String firstName1 = c1.getProfile() == null? null : c1.getProfile().getFirstName().toLowerCase(); 
String firstName2 = c2.getProfile() == null? null : c1.getProfile().getFirstName().toLowerCase(); 

return Ordering.natural().nullsFirst().compare(firstName1, firstName2); 
// or nullsLast(), depending on what you prefer 

Ou, plus simple:

Comparator<UserModel> comparator = 
    Ordering.natural() 
      .nullsFirst() 
      .onResultOf(model -> c1.getProfile() == null? null : c1.getProfile().getFirstName().toLowerCase()); 
+0

Que faire si 'getFirstName()' renvoie null? – CKing

+0

Il va lancer un NPE. Si firstName peut être nul, alors l'OP doit ajouter encore une autre vérification nulle. –

+0

Yup. C'est précisément la question. D'où vient l'exception 'NullPointerException'. – CKing

1

J'avais l'impression Google Collection s'occuperaient ces valeurs nulles

La méthode nullLast ne vérifie si un élément particulier la collection est null et placez-le à la fin de la collection.

Cette ligne spécifique lance le NullPointerException:

.compareTo(c2.getProfile().getFirstName().toLowerCase());

Il y a deux possibilités pour nulls ici:

  1. c2.getProfile() est nulle
  2. c2.getProfile().getFirstName() est nulle

Vous devez protéger explicitement votre implémentation Comparator de ces null s.