关于java:创建对象数组时的NullPointerException

NullPointerException when Creating an Array of objects

本问题已经有最佳答案,请猛点这里访问。

我一直在尝试创建一个包含两个值的类的数组,但是当我尝试将值应用于数组时,我得到一个NullPointerException。

1
2
3
4
5
6
public class ResultList {
    public String name;
    public Object value;

    public ResultList() {}
}

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

为什么我会收到此错误,如何解决?


你创建了数组但没有放任何东西,所以你有一个包含5个元素的数组,所有元素都是null。你可以添加

1
boll[0] = new ResultList();

在你设置boll [0] .name的行之前。


1
ResultList[] boll = new ResultList[5];

创建一个size = 5的数组,但不创建数组元素。

您必须实例化每个元素。

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


正如许多人在前面的答案中所说,ResultList[] boll = new ResultList[5];只是创建一个ResultList数组,其大小为5,其中所有元素都为null。当您使用boll[0].name时,您正在尝试执行类似null.name的操作,这是NullPointerException的原因。使用以下代码:

1
2
3
4
5
6
7
8
9
10
11
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循环完成,你可以使用

1
boll[0].name ="iiii";

我想通过电话

1
 ResultList[] boll = new ResultList[5];

你创建了一个可以容纳5个ResultList的列表,我认为你必须在设置值之前初始化boll [0]。

1
boll[0] = new ResultList();


1
2
3
4
5
6
7
8
9
10
11
12
13
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对象,但每个索引都是空的,指向空引用,这是你得到null的原因。
因此,只需在该索引上分配Object,然后设置该值。


首先,您已创建了ResultList类型的5个元素,但在插入值时,您插入的名称和值错误。您可以使用构造函数来创建值并将值插入数组元素。

1
2
3
4
5
6
7
8
9
10
11
12
13
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");
    }


1
ResultList p[] = new ResultList[2];

通过编写这个,您只需为2个元素的数组分配空间。
您应该通过执行以下操作初始化引用变量:

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

此外,您可以通过向类添加调试行来证明这一点,例如:

1
2
3
4
5
6
7
8
public class ResultList {
    public String name;
    public Object value;

    public ResultList() {
        System.out.println("Creating Class ResultList");
    }
}

每当创建一个对象时,必须调用其中一个构造函数(如果没有构造函数,则会自动创建一个默认构造函数,类似于您类中已有的构造函数)。如果您只有一个构造函数,那么创建对象的唯一方法是调用该构造函数。如果行

1
ResultList[] boll = new ResultList[5];

真的创建了5个新对象,你会看到你的调试行出现在控制台上5次。如果没有,您知道没有调用构造函数。另请注意,上面的行没有带有打开和关闭括号"()"的参数列表,因此它不是函数调用 - 或构造函数调用。相反,我们只是指类型。我们说:"我需要一个ResultList对象数组的空间,总共多达5个。"在此行之后,您拥有的只是空白空间,而不是对象。

当您尝试各种修复时,调试行将有助于确认您获得了所需的内容。


您可以尝试这种情况,也可以在ResultList类中使变量"name"为静态。所以当ResultList [] boll = new ResultList [5]时;在那个时候执行,该类中的所有变量都将被赋值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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() {}
}