#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]
на самом деле не создает 10A
секунд.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[]
к inObjectB
, который равен null .2. @PRamesh отредактировал мой ответ, это должно дать вам правильный пример.
Ответ №3:
Вы не инициализировали ObjectB. Для ObjectB не выделено памяти. Следовательно, отображается исключение нулевого указателя (ничто не выделяется для ссылки ObjectB).
Это должно сработать:
класс C { B ObjectB = new B();
public static void main(String[] args) {
ObjectB.ObjectA[0].a = 1;
}
}