提问人:marjasin 提问时间:12/17/2009 最后编辑:Tommarjasin 更新时间:9/27/2019 访问量:65143
创建对象数组时出现 NullPointerException [duplicate]
NullPointerException when Creating an Array of objects [duplicate]
问:
我一直在尝试创建一个包含两个值的类数组,但是当我尝试将值应用于数组时,我得到了一个 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";
}
}
为什么会出现此异常,如何解决?
答:
您创建了数组,但没有在其中放置任何内容,因此您有一个包含 5 个元素的数组,所有这些元素都是 null。您可以添加
boll[0] = new ResultList();
在设置 boll[0].name 的行之前。
评论
我想通过调用
ResultList[] boll = new ResultList[5];
您创建了一个可以容纳 5 个 ResultList 的数组,但必须先初始化,然后才能设置值。boll[0]
boll[0] = new ResultList();
ResultList[] boll = new ResultList[5];
创建一个 size=5 的数组,但不创建数组元素。
您必须实例化每个元素。
for(int i=0; i< boll.length;i++)
boll[i] = new ResultList();
正如许多人在前面的答案中所说,只需创建一个大小为 5 的 ResultList 数组,其中所有元素均为 null。当您使用 时,您正在尝试执行类似操作,这就是 NullPointerException 的原因。使用以下代码:ResultList[] boll = new ResultList[5];
boll[0].name
null.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";
此外,您可以通过向类添加调试行来证明这一点,例如:
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 个。在这一行之后,你所拥有的只是空白空间,而不是对象。
当您尝试各种修复程序时,调试行将有助于确认您正在获得所需的内容。
ResultList p[] = new ResultList[2];
通过编写此内容,您只需为 2 个元素的数组分配空间。 您应该通过执行以下操作来初始化引用变量:
for(int i = 0; i < 2; i++){
p[i] = new ResultList();
}
首先,您已经创建了 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");
}
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,然后设置值即可。
您可以尝试此方案,也可以在 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() {}
}
评论