2016-08-07 4 views
0

Я продолжаю получать nullpointerexception, когда пытаюсь сортировать пользователей, у которых определенный пользователь имеет нулевое значение в своем профиле. У меня было впечатление, что Google Collection будет обрабатывать эти нулевые значения, но он, похоже, не работает.Cant sort null with compator

Это код, я использую:

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

Эта специфическая линия бросает nullpointerexception:

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

Его, потому что getProfile() является нулевым.
Как я могу это исправить? Я хочу иметь возможность сортировать пользователей с нулевыми значениями.

+0

Я не понимаю, как это дубликат этого вопроса. Я спрашивал (возможно, не напрямую), как его исправить (если возможно) с помощью Google Collection –

ответ

2

Нет, Guava не будет игнорировать ваше исключение NullPointerException. Вы предоставляете компаратор, и этот компаратор должен уважать контракт компаратора. Выброс NullPointerException не является частью контракта.

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 

Или, проще:

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

Что делать, если 'getFirstName()' возвращает null? – CKing

+0

Это бросит NPE. Если firstName может быть нулевым, то OP необходимо добавить еще одну нулевую проверку. –

+0

Yup. Это точно вопрос. Откуда возникает «NullPointerException». – CKing

1

Я был под впечатлением Google Collection будет обрабатывать эти нулевые значения

Метод nullLast будет проверять только если конкретный элемент коллекция null и поместите ее в конце коллекции.

Эта специфическая линия бросает NullPointerException:

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

Есть две возможности нулям здесь:

  1. c2.getProfile() является нулевой
  2. c2.getProfile().getFirstName() является нулевым

Вам необходимо явно защитить реализацию Comparator от этих null.