Указатель нуля в незнакомом месте

#java #nullpointerexception

#java #исключение nullpointerexception

Вопрос:

Я не могу понять, как это может вызвать исключение nullpointer. Код выглядит следующим образом:

 if (gameServers.isEmpty()) {
    return false;
}
int freeSlots = Integer.MIN_VALUE;
GameServer chosenOne = null;
for (GameServer gs : gameServers) {
   if (gs.getSlots() > freeSlots) { // THIS LINE throws the nullpointer exception
       freeSlots = gs.getSlots();
       chosenOne = gs;
   }
}
 

Где gs.getSlots() является простым return this.slots (типа int). Список игровых серверов заполнен объектами, которые также не могут возвращать значение null. new GameServer(..., ..., slots)

Может кто-нибудь даже сказать мне, с чего начать поиск?

Комментарии:

1. gameServers содержит null элемент. Другого способа получить NPE в этой строке нет.

2. В какой строке находится указатель null?

3. @Andrew_CS смотрите комментарий в коде

4. @Keppil Это имеет смысл, но тогда мне интересно, как он туда попал. Я только добавляю объекты new GameServer(...) и никогда не удаляю их. Невозможно, чтобы any new Obj() возвращал значение null, не так ли?

5. Ах, на телефоне, была отключена страница.

Ответ №1:

Вам нужно проверить, имеет ли значение gs значение null в вашем цикле for, что-то вроде

 if(gs != null amp;amp; <insert original if statement>){
    ....
 

Комментарии:

1. Добавление нулевой проверки без понимания того, почему это может быть null , является плохой практикой imo. Он скрывает фактическую проблему, не решая ее.

2. Да, OP должен выяснить, почему в коллекции есть null, однако в некоторых приложениях у него может не быть доступа к этой информации. Все еще следует проверить, чтобы быть в безопасности.

3. Я категорически не согласен. Защитная проверка null везде на всякий случай — плохая практика программирования.

4. После нахождения null было бы до OP, чтобы удалить из коллекции, вызвать исключение и т.д. Я бы не позволил этому привести к сбою программы, если бы это не было чем-то, что я мог бы предотвратить на другом конце.

5. Что ж, как бы мне ни хотелось выяснить первопричину, я полагаю, что это будет мой обходной путь для завтрашней демонстрации. После завтрашнего дня, если все пойдет хорошо, код все равно больше никогда не будет просматриваться.

Ответ №2:

Хотя ваша коллекция не пуста, в ней может быть нулевой элемент.

Например

     List<String> myList = new ArrayList<String>();
    myList.add(null);
    if(!myList.isEmpty()) {
        for(String str : myList){
            System.out.println(str.length());
        }
    }
 

вызовет NPE. Чтобы избежать этого, вы можете выполнить простую проверку null.

     for (GameServer gs : gameServers) {
        if(gs != null) {
            if (gs.getSlots() > freeSlots) { 
                freeSlots = gs.getSlots();
                chosenOne = gs;
            }
        }
    }