创建对象数组时出现 NullPointerException [duplicate]

NullPointerException when Creating an Array of objects [duplicate]

提问人:marjasin 提问时间:12/17/2009 最后编辑:Tommarjasin 更新时间:9/27/2019 访问量:65143

问:

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

public class ResultList {
    public String name;
    public Object value;
}

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

为什么会出现此异常,如何解决?

Java 数组 nullPointerException

评论

0赞 Nathan Hughes 12/17/2009
将 ResultList 重命名为 NameValuePair 之类的名称可能会更清楚一些。
0赞 enguerran 12/18/2009
您知道已经存在具有绑定键/值的类吗?例如,Map<String、Object>的实现。
5赞 Peter Lawrey 12/18/2009
来自 C++ 的一个常见问题,新数组是一个引用数组,但不会创建实际对象。您必须将它们创建为单独的步骤。Java 不允许像 C++ 那样的对象数组。

答:

44赞 Nathan Hughes 12/17/2009 #1

您创建了数组,但没有在其中放置任何内容,因此您有一个包含 5 个元素的数组,所有这些元素都是 null。您可以添加

boll[0] = new ResultList();

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

评论

5赞 enguerran 12/17/2009
通过实例化,您将拥有一个包含 {null, null, null, null, null} 的 5 元素数组。
3赞 ufukgun 12/17/2009 #2

我想通过调用

ResultList[] boll = new ResultList[5];

您创建了一个可以容纳 5 个 ResultList 的数组,但必须先初始化,然后才能设置值。boll[0]

boll[0] = new ResultList();
10赞 chburd 12/17/2009 #3
ResultList[] boll = new ResultList[5];

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

您必须实例化每个元素。

for(int i=0; i< boll.length;i++)
    boll[i] = new ResultList();
3赞 Rishikesh Dhokare 1/8/2013 #4

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

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 循环基本上用一个对象初始化数组中的每个元素,一旦 for 循环完成,你可以使用ResultList

boll[0].name = "iiii";
0赞 spazBarnum 12/5/2015 #5

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

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 个。在这一行之后,你所拥有的只是空白空间,而不是对象。

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

1赞 Usama Tahir 7/4/2017 #6
ResultList p[] = new ResultList[2];

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

for(int i = 0; i < 2; i++){
    p[i] = new ResultList();
 }
0赞 arshadImam 7/14/2017 #7

首先,您已经创建了 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赞 Anup 10/29/2017 #8
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 引用,这就是您获得 null 的原因。 因此,只需在该索引上分配 Object,然后设置值即可。

-1赞 Hrishabkumar jha 11/22/2017 #9

您可以尝试此方案,也可以在 ResultList 类中使变量“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赞 Hrishabkumar jha 11/22/2017
您可以尝试上述方案,也可以在 ResultList 类中使变量“name”静态。因此,当 ResultList[] boll = new ResultList[5];在该类的所有变量都将被赋值时执行
0赞 Qwertie 11/22/2017
你能解释一下你做了什么来解决这个问题吗?
1赞 shmosel 11/22/2017
这在几个答案中已经提出。
0赞 Mamun 11/22/2017
这并不能提供问题的答案。一旦你有足够的声誉,你就可以对任何帖子发表评论;相反,提供不需要提问者澄清的答案。- 从评论
0赞 shmosel 11/23/2017
@Mamun 不过确实如此。