我是Java的新手并且正在开展一个小型学习项目,但我陷入困境。我试图弄清楚为什么for循环在MyApp.main(MyApp.java:26)中的线程“main”java.lang.NullPointerException中生成Exception。谁能解释我做错了什么?我非常感谢你的帮助!
// Create array of toddlers
babyMikeyToddler[] toddlercollection = new babyMikeyToddler[4];
toddlercollection[0] =new babyMikeyToddler("Baby Mikey",10,2);
toddlercollection[1] =new babyMikeyToddler("Baby Mikey",10,2);
toddlercollection[2] =new babyMikeyToddler("Baby Mikey",10,2);
for(int i =0; i < toddlercollection.length; i++)
{
System.out.println(toddlercollection[i].getName());
}
}
}
答案 0 :(得分:5)
你的循环将达到幼儿收集[3](因为3小于数组长度),这是空的。因此,当您致电toddlercollection[i].getName()
时,它会尝试在getName()
上致电null
,这会导致异常。
答案 1 :(得分:0)
除JacobM的答案外,toddlercollection.length
表示阵列所拥有的“插槽”数量,而不是您对阵列所做的分配数量。
要解决您的问题,请在阵列中仅分配3个插槽
babyMikeyToddler[] toddlercollection = new babyMikeyToddler[3];
或填写所有广告位
toddlercollection[3] =new babyMikeyToddler("Baby Mikey",10,2);
或者有一个填充槽的计数器并使用它进行迭代
int c = 0;
toddlercollection[c++] =new babyMikeyToddler("Baby Mikey",10,2);
toddlercollection[c++] =new babyMikeyToddler("Baby Mikey",10,2);
toddlercollection[c++] =new babyMikeyToddler("Baby Mikey",10,2);
for(int i =0; i < c; i++) { ... }
或更好地使用List
List<babyMikeyToddler> toddlercollection = new ArrayList<>();
toddlercollection.add(new babyMikeyToddler("Baby Mikey",10,2));
toddlercollection.add(new babyMikeyToddler("Baby Mikey",10,2));
toddlercollection.add(new babyMikeyToddler("Baby Mikey",10,2));
for(int i =0; i < toddlercollection.size(); i++) {
System.out.println(toddlercollection[i].getName());
}
// using enhanced for loop
for(babyMikeyToddler elem : toddlercollection) {
System.out.println(elem.getName());
}
答案 2 :(得分:0)
首先请坚持Java命名约定,否则代码真的很混乱。类名必须以大写字母开头(如BabyMikeyToddler
),变量/函数名称必须是驼峰式的(如toddlerCollection
)。
每当你得到一个NPE时,都是因为你正在对NULL变量执行操作。在你的情况下,你使用for循环来打印值,所以为什么不使用它来分配值?(毕竟puppycollection数组中的每个元素都有相同的数据)。所以你可以做到
for(int i =0; i < toddlercollection.length; i++)
{
toddlercollection[i] =new babyMikeyToddler("Baby Mikey",10,2);
}
您正在for循环中获取NPE,因为幼儿收集[3]未分配对象且为空。然而,你正试图打印它的价值。我在上面建议的其他内容总是在操作之前检查变量是否为NULL。
例如
for(int i =0; i < toddlercollection.length; i++)
{
if(toddlercollection[i].getName() != null)
{
System.out.println(toddlercollection[i].getName());
}
}