#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(...)
и никогда не удаляю их. Невозможно, чтобы anynew 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;
}
}
}