Исключение NullPointerException при создании массива объектов [дублировать]
-
20-09-2019 - |
Вопрос
На этот вопрос уже есть ответ здесь:
Я пытался создать массив класса, содержащий два значения, но когда я пытаюсь применить значение к массиву, я получаю исключение NullPointerException.
public class ResultList {
public String name;
public Object value;
public ResultList() {}
}
.
public class Test {
public static void main(String[] args){
ResultList[] boll = new ResultList[5];
boll[0].name = "iiii";
}
}
Почему я получаю эту ошибку и как я могу ее исправить?
Решение
Вы создали массив, но ничего в него не поместили, поэтому у вас есть массив, содержащий 5 элементов, все из которых имеют значение NULL.Вы могли бы добавить
boll[0] = new ResultList();
перед строкой, в которой вы установили boll[0].name.
Другие советы
ResultList[] boll = new ResultList[5];
создает массив размером = 5, но не создает элементы массива.
Вам нужно создать экземпляр каждого элемента.
for(int i=0; i< boll.length;i++)
boll[i] = new ResultList();
я думаю, позвонив
ResultList[] boll = new ResultList[5];
вы создали список, который может содержать 5 ResultList, я думаю, вам нужно инициализировать boll[0], прежде чем устанавливать значение.
boll[0] = new ResultList();
Как многие говорили в предыдущих ответах, ResultList[] boll = new ResultList[5];
просто создает массив ResultList размером 5, где все элементы имеют значение NULL.Когда вы используете boll[0].name
, вы пытаетесь сделать что-то вроде null.name
и это причина NullPointerException.Используйте следующий код:
public class Test {
public static void main(String[] args){
ResultList[] boll = new ResultList[5];
for (int i = 0; i < boll.length; i++) {
boll[i] = new ResultList();
}
boll[0].name = "iiii";
}
}
Здесь цикл for инициализирует каждый элемент массива с помощью ResultList
объект, и как только цикл for завершится, вы можете использовать
boll[0].name = "iiii";
Более того, вы можете доказать это себе, добавив в свой класс строку отладки, например:
public class ResultList {
public String name;
public Object value;
public ResultList() {
System.out.println("Creating Class ResultList");
}
}
Каждый раз, когда создается объект, необходимо вызвать один из его конструкторов (если конструктор отсутствует, автоматически создается конструктор по умолчанию, аналогичный тому, который уже есть в вашем классе).Если у вас есть только один конструктор, единственный способ создать объект — вызвать этот конструктор.Если линия
ResultList[] boll = new ResultList[5];
действительно создал 5 новых объектов, вы увидите, что ваша строка отладки появится на консоли 5 раз.Если это не так, вы знаете, что конструктор не вызывается.Обратите также внимание, что в приведенной выше строке нет списка параметров с открывающими и закрывающими круглыми скобками «()», поэтому это не вызов функции или вызов конструктора.Вместо этого мы имеем в виду только тип.Мы говорим:«Мне нужно место для множества объектов ResultList, всего до 5». После этой линии все, что у вас есть, это пустое пространство, а не объекты.
Когда вы пробуете различные исправления, строка отладки поможет убедиться, что вы получаете то, что хотите.
ResultList p[] = new ResultList[2];
Написав это, вы просто выделяете место для массива из двух элементов.Вы должны инициализировать ссылочную переменную, выполнив следующие действия:
for(int i = 0; i < 2; i++){
p[i] = new ResultList();
}
class ResultList {
public String name;
public Object value;
public ResultList() {}
}
public class Test {
public static void main(String[] args){
ResultList[] boll = new ResultList[5];
boll[0] = new ResultList(); //assign the ResultList objet to that index
boll[0].name = "iiii";
System.out.println(boll[0].name);
}
}
Пока вы не создали объект ResultSet, но каждый индекс пуст, указывающий на нулевую ссылку, которая является причиной того, что вы получаете нулевое значение.Поэтому просто назначьте объект этому индексу, а затем установите значение.
Прежде всего, вы создали 5 элементов типа ResultList, но при вставке значения вы неправильно вставляете имя и значение.вы можете использовать конструктор для создания и вставки значений в элементы массива.
class ResultList {
public String name;
public Object value;
public ResultList(String name,Object value){
this.name = name;
this.value = value;
System.out.println(name+" --- "+value);
}
}
public static void main(String[] args) {
ResultList[] boll = new ResultList[5];
boll[0] = new ResultList("myName","myValue");
}
Либо вы можете попробовать этот сценарий, либо вы можете сделать переменную "name" статической в классе resultList.Итак, когда результирующий список[] boll = новый результирующий список[5];выполняется в тот момент, когда будет присвоена вся переменная из этого класса
public static void main(String[] args){
ResultList[] boll = new ResultList[5];
boll[0] = new ResultList();
boll[0].name = "iiii";
System.out.println(boll[0].name);
}
public class ResultList {
public static String name;
public Object value;
public ResultList() {}
}