2009-12-17 104 views
25

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

public 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].name = "iiii"; 
    } 
} 

为什么我得到这个错误,我该如何解决它?

+0

将ResultList重命名为NameValuePair可能会更清楚一些。 – 2009-12-17 15:59:55

+0

你知道一个绑定键/值的类已经存在吗?例如Map 的实现。 – enguerran 2009-12-17 16:18:34

+3

来自C++的常见问题,新数组是一个引用数组,但实际的对象不会被创建。你必须将它们作为一个单独的步骤来创建。 Java不允许像C++那样的对象数组。 – 2009-12-17 21:27:12

回答

35

您创建了该数组,但没有放入任何内容,因此您有一个包含5个元素的数组,其中全部为空。您可以添加

boll[0] = new ResultList(); 

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

+4

随着您的实例化,您将拥有一个包含以下元素的5元素数组:{null,null,null,null,null}。 – enguerran 2009-12-17 15:53:04

1

我想通过调用

ResultList[] boll = new ResultList[5]; 

创建可容纳5 ResultList名单,我认为你有你的设定值[0]之前初始化铃。

boll[0] = new ResultList(); 
4
ResultList[] boll = new ResultList[5]; 

创建尺寸= 5的阵列,但不创建数组元素。

你必须实例化每个元素。

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

正如许多人在以前的解答,所述,ResultList[] boll = new ResultList[5];简单地创建具有大小5,其中的所有元素都为空的ResultList的阵列。当您使用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"; 
0

此外,还可以

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个。”在这一行之后,你拥有的只是空的空间,而不是物体。

当您尝试各种修复程序时,调试行将帮助确认您获得了您想要的。

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

通过写这个你只需为2个元素的数组分配空间。 你应该这样做初始化引用变量:

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

首先,你必须创建ResultList型的5元所有的,但插入值,当你插入名称和值是错误的。您可以使用构造函数来创建数组元素并将其插入到数组元素中。

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"); 
    } 
0
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对象,但各项指标为空时指向空引用这是你得到空的原因。 因此只需在该索引上分配对象,然后设置该值即可。

-1

要么你可以尝试这种情况,或者你可以在ResultList Class中使变量“name”变为静态。所以当ResultList [] boll = new 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() {} 
} 
+0

您可以尝试上述方案,或者您可以在ResultList Class中将变量“name”设为静态。所以当ResultList [] boll = new ResultList [5];在那个时候被执行,所有来自该类的变量将被分配 – 2017-11-22 07:23:14

+0

你能解释一下你做了什么来解决这个问题吗? – Qwertie 2017-11-22 07:39:33

+1

这已经在几个答案中提出。 – shmosel 2017-11-22 07:40:20