Я пытаюсь создать цикл 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, но сам никогда не задавал вопросов. Я пробовал искать здесь, но еще не нашел ничего, что помогло бы мне. Заранее спасибо!
вы также можете определить переменную для сохранения количества элементов в массиве (не нужно зацикливать весь массив, если он не заполнен); конечно, проверка, является ли элемент null перед вызовом его методов (staffList[i] != null && staffList[i].get...), не повредит. Альтернатива: используйте ArrayList, который растет по мере необходимости...




Вы можете обновить свой код, как показано ниже, чтобы избежать 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)).
@MarkRotteveel Да, нет необходимости вкладывать операторы if. Одиночные операторы if также могут работать, как вы упомянули.
staffList- это массив, который является заполнителем для 20 элементов, поэтому цикл for проходит безNPE, потому что его длина равна 20. Когда он переходит кstaffList[i]для извлеченияSalespersonобъекта, он выдаетNPE, объекта нет. В это времяstaffList[i] = nullИтак,null.getID()бросаетNPE.