Исключение NullPointerException при создании массива объектов [дублировать]

StackOverflow https://stackoverflow.com/questions/1922677

Вопрос

На этот вопрос уже есть ответ здесь:

Я пытался создать массив класса, содержащий два значения, но когда я пытаюсь применить значение к массиву, я получаю исключение 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() {}
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top