почему исключение Nullpointerexception?

#java #nullpointerexception

#java #исключение nullpointerexception

Вопрос:

Это сценарий:

 class A{
int a;
}

class B{
A objectA[]=new A[10] ;
}

class C{
B ObjectB;
public static void main(String[] args){
ObjectB.ObjectA[0].a=1;
}
}
  

Я получаю исключение nullpointerexception в основной операции. Однако, если я объявляю только один объект класса A, я не получаю ошибку. Почему так? Как мне это исправить?

Комментарии:

1. new A[10] на самом деле не создает 10 A секунд.

2. разве ваш ObjectB не равен нулю?

3. @bzlm- Хорошо, я понял. Но если я заменю его на objecta=new A() , он будет работать нормально. Как это возможно?

4. @PRamesh, это была именно моя точка зрения. 🙂

5. @peshkira- Извините, должно быть, это было B ObjectB=new ObjectB();

Ответ №1:

(1) B ObjectB; не создает новый экземпляр B , он просто создает переменную, чтобы создать экземпляр; B ObjectB = new B();

(2) Также A objectA[]=new A[10] ; выделяет массив, но не элементы в массиве, и ObjectB.ObjectA[0].a=1; также вызовет NPE.

Ответ №2:

вызов new B() инициализирует массив объектов типа A , но ни один из объектов-членов. Вы можете исправить это, сначала инициализируя objectB , а затем вызывая objectA[i] = new A() для каждого элемента в массиве.

 class B{
    A objectA[]=new A[10] ;
    {
        for (int i = 0; i < 10; i  )
            objectA[i] = new A();
    }
}

class C{
B ObjectB = new B();
public static void main(String[] args){
ObjectB.ObjectA[0].a=1;
}
}
  

Комментарии:

1. Неверно. Хотя ему нужно будет это сделать, NPE вызван попыткой доступа ObjectA[] к in ObjectB , который равен null .

2. @PRamesh отредактировал мой ответ, это должно дать вам правильный пример.

Ответ №3:

Вы не инициализировали ObjectB. Для ObjectB не выделено памяти. Следовательно, отображается исключение нулевого указателя (ничто не выделяется для ссылки ObjectB).

Это должно сработать:

класс C { B ObjectB = new B();

 public static void main(String[] args) {
    ObjectB.ObjectA[0].a = 1;
}
  

}