2016-08-07 7 views
0

Ich bekomme immer eine nullpointerexception, wenn ich versuche, Benutzer zu sortieren, wo ein bestimmter Benutzer einen Nullwert in seinem Profil hat. Ich war unter dem Eindruck, Google Collection würde diese Nullwerte behandeln, aber es scheint nicht zu funktionieren.Kann nicht null mit Komparator

Dies ist der Code, den ich verwenden:

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()); 

Diese spezielle Linie wirft die nullpointerexception:

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

Sein, weil getProfile() null ist.
Wie kann ich das beheben? Ich möchte meine Benutzer mit Nullwerten sortieren können.

+0

Ich verstehe nicht, wie das ein Duplikat zu dieser Frage ist. Ich habe gefragt (vielleicht nicht direkt), wie man es (wenn möglich) mit Google Collection repariert –

Antwort

2

Nein, Guava ignoriert Ihre NullPointerException nicht. Sie stellen einen Komparator bereit, und dieser Komparator sollte den Vergleicher-Vertrag berücksichtigen. Das Werfen von NullPointerException ist nicht Teil des Vertrags.

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 

Oder einfacher:

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

Was ist, wenn 'getFirstName()' null zurückgibt? – CKing

+0

Es wird eine NPE werfen. Wenn firstName null sein kann, muss das OP noch eine weitere Nullprüfung hinzufügen. –

+0

Yup. Das ist genau die Frage. Woher kommt die 'NullPointerException'? – CKing

1

Ich hatte den Eindruck, Google-Sammlung würde diese null Werte behandeln

Die nullLast Methode nur, wenn ein bestimmtes Element überprüfen wird in Die Sammlung ist null und legen Sie es am Ende der Sammlung.

Diese spezifische Linie führt den Nullpointer:

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

Es gibt zwei Möglichkeiten für nulls hier:

  1. c2.getProfile() ist null
  2. c2.getProfile().getFirstName() ist null

Sie müssen Ihre Comparator Implementierung explizit von diesen null s sichern.