带有对象的数组上的Java For Loop Error

时间:2013-09-07 22:14:55

标签: java

我是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());
}

    }

}

3 个答案:

答案 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());
        }

    }