Как обойти array.equals(otherArray), оценивающий значение null?

Я пытаюсь создать цикл for, который перебирает массив, сравнивая пользовательский ввод с каждым объектом, используя метод getID(), который возвращает сохраненные идентификаторы пользователей для разных сотрудников. Данные не сохраняются между запусками, поэтому в первом цикле все объекты (я полагаю) должны быть нулевыми. При этом я получаю исключение nullPointerException в строке, которая должна сравнивать строки, полученные с помощью getID(), и строку userInput. Массив инициализируется следующим образом:

Salesperson[] staffList;
staffList = new Salesperson[20];

Вот рассматриваемый цикл, оператор if — это строка, которая выдает NPE:

for(i = 0; i < staffList.length; i++) 
 {
     if (staffList[i].getID().equals(idNum))
     {
          duplicateID = true;
     }
 }

Вот класс для массива Salesperson:

public class Salesperson
{
private String name;
private String idNum;
private double annSales;

//Various getter and setter methods here
}

Если я что-то пропустил, пожалуйста, дайте мне знать. Раньше я использовал Stack Overflow, но сам никогда не задавал вопросов. Я пробовал искать здесь, но еще не нашел ничего, что помогло бы мне. Заранее спасибо!

staffList - это массив, который является заполнителем для 20 элементов, поэтому цикл for проходит без NPE, потому что его длина равна 20. Когда он переходит к staffList[i] для извлечения Salesperson объекта, он выдает NPE, объекта нет. В это время staffList[i] = null Итак, null.getID() бросает NPE.
Pradip Karki 09.03.2019 07:23

вы также можете определить переменную для сохранения количества элементов в массиве (не нужно зацикливать весь массив, если он не заполнен); конечно, проверка, является ли элемент null перед вызовом его методов (staffList[i] != null && staffList[i].get...), не повредит. Альтернатива: используйте ArrayList, который растет по мере необходимости...

user85421 09.03.2019 08:10
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
44
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете обновить свой код, как показано ниже, чтобы избежать NPE.

    Salesperson[] staffList;
        staffList = new Salesperson[20];

        for(int i = 0; i < staffList.length; i++)
        {
            Salesperson salesPerson = staffList[i]; // staffList[i] i.e salesPerson = null.... null.getId throws NPE.

System.out.println("sales  = " + sales); // sales = null
            if (sales != null) {
                if (sales.getId().equals(idNum)) {
                      //Do something..
                }
            }

        }

Здесь нет необходимости вкладывать операторы if, одиночное if тоже сработает if (sales != null && sales.getId().equals(idNum)).

Mark Rotteveel 09.03.2019 09:14

@MarkRotteveel Да, нет необходимости вкладывать операторы if. Одиночные операторы if также могут работать, как вы упомянули.

KZapagol 09.03.2019 09:26

Другие вопросы по теме