Java, Objects, Constructors: получение ошибки NullPointerException

Вот ошибка, которую я получаю: Я знаю, что это говорит мне, что [0].setAttribute(0); это неправильно, но я не знаю, почему это неправильно. Как я должен заполнить массив экземпляров значениями?

java.lang.NullPointerException
 at DecisionTree.TestTree.main(TestTree.java:6)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
 at java.lang.reflect.Method.invoke(Unknown Source)
 at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272)

Это класс, который я использую для тестирования моих конструкторов.

package DecisionTree;

public class TestTree {
 public static void main(String[] args) {
 Instance[] a = new Instance[5];
 a[0].setAttribute(0);
 a[1].setAttribute(1);
 a[2].setAttribute(2);
 a[3].setAttribute(3);
 a[4].setAttribute(4);
 a[0].setLabel(true);
 a[1].setLabel(false);
 a[2].setLabel(true);
 a[3].setLabel(false);
 a[4].setLabel(true);
 DecisionTree work = new DecisionTree(a);
 System.out.println(work.root.cutoff);
 }
}

Класс экземпляра:

package DecisionTree;

public class Instance {

 ****** attribute;
 boolean label;

 public Instance(****** a, boolean c) {
 attribute = a;
 label = c;
 }

 public ****** getAttribute() {
 return attribute;
 }

 public void setAttribute(****** a) {
 attribute = a;
 }

 public boolean getLabel() {
 return label;
 }

 public void setLabel(boolean c) {
 label = c;
 }
}
3 ответа

Вы создаете массив ссылочного типа, объектов, но пытаетесь использовать его, прежде чем заполнять его действительными объектами. Когда он создан, он заполняется только нулями. Так заполните его, а затем используйте его.

например,

Instance[] a = new Instance[5];
for (int i == 0; i < a.length; i++) {
 // first create your instance
 a[i] = new Instance(); // don't know if this is a valid constructor

 // and only *then* can you use it
 a[i].setAttribute(i);
 a[i].setLabel(i % 2 == 0);
}

Рассмотрим множество ссылок, таких как пустая парковка. Вы не можете водить любые автомобили в лоте, пока вы не ставите машины в лот. Точно так же вы не можете использовать какие-либо элементы в массиве ссылок до тех пор, пока вы не инициализируете эти элементы.


Вы еще не поместили никаких объектов в свой массив. Экземпляр [] a = новый экземпляр [5];

//создает пустой массив размером 5, с достаточным пространством в каждом для одного pbject экземпляра типа. Итак, теперь вам нужно поставить 5 экземпляров.

Instance a1 = new Instance();
a[0] = a1;
Instance a2 = new Instance();
..
Instance a5 = new Instance();

или,

for(int i =0; i <5; i++){
a[i] = new Instance;
}

или некоторые изменения этого.


Когда вы объявляете массив объектов, все элементы внутри него по умолчанию будут иметь значение null. Вам нужно создать экземпляры экземпляра и вставить в него массив, прежде чем использовать элементы массива

licensed under cc by-sa 3.0 with attribution.