Подтвердить что ты не робот

NullPointerException при создании массива объектов

Я пытался создать массив класса, содержащий два значения, но когда я пытаюсь применить значение к массиву, я получаю исключение NullPointerException.

public class ResultList {
    public String name;
    public Object value;
}

public class Test {
    public static void main(String[] args){
        ResultList[] boll = new ResultList[5];
        boll[0].name = "iiii";
    }
}

Почему я получаю это исключение и как его исправить?

4b9b3361

Ответ 1

Вы создали массив, но ничего не поместили в него, поэтому у вас есть массив, содержащий 5 элементов, все из которых равны нулю. Вы можете добавить

boll[0] = new ResultList();

перед строкой, где вы устанавливаете boll [0].name.

Ответ 2

ResultList[] boll = new ResultList[5];

создает массив размером = 5, но не создает элементы массива.

Вам нужно создать экземпляр каждого элемента.

for(int i=0; i< boll.length;i++)
    boll[i] = new ResultList();

Ответ 3

Я думаю, позвонив

ResultList[] boll = new ResultList[5];

вы создали массив, который может содержать 5 ResultList, но вы должны инициализировать boll[0], прежде чем сможете установить значение.

boll[0] = new ResultList();

Ответ 4

Как было сказано в предыдущих ответах, ResultList[] boll = new ResultList[5]; просто создает массив ResultList с размером 5, где все элементы равны нулю. Когда вы используете 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";

Ответ 5

Кроме того, вы можете доказать это сами, добавив строку отладки в свой класс, например:

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". После этой строки у вас есть пустое пространство, а не объекты.

При тестировании различных исправлений строка отладки поможет подтвердить, что вы получаете то, что хотите.

Ответ 6

ResultList p[] = new ResultList[2];

Записывая это, вы просто выделяете пространство для массива из двух элементов. Вы должны инициализировать ссылочную переменную, выполнив следующее:

for(int i = 0; i < 2; i++){
    p[i] = new ResultList();
 }

Ответ 7

в первую очередь вы создали 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");
    }

Ответ 8

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, но каждый индекс пуст, который указывает на нулевую ссылку, по которой вы получаете нуль. Поэтому просто назначьте Object по этому индексу, а затем установите значение.

Ответ 9

Либо вы можете попробовать этот сценарий, либо сделать переменную "name" static в классе ResultList. Поэтому, когда ResultList [] boll = новый ResultList [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() {}
}