-2

我是 Java 新手,正在从事一个小型学习项目,但我被困住了。我试图弄清楚为什么 for 循环在 MyApp.main(MyApp.java:26) 的线程“main”java.lang.NullPointerException 中生成异常。谁能解释我做错了什么?我非常感谢您的帮助!

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

    }

}
4

3 回答 3

5

您的循环将达到 toddlercollection[3] (因为 3 小于数组长度),即为空。因此,当您调用 时toddlercollection[i].getName(),它会尝试调用getName()on null,这会导致异常。

于 2013-09-07T22:17:26.737 回答
0

首先请遵守 Java 命名约定,否则代码真的很混乱。类名必须以大写字母(like BabyMikeyToddler)开头,变量/函数名必须是驼峰式(like toddlerCollection)。

每当您获得 NPE 时,都是因为您正在对 NULL 变量执行操作。在您的情况下,您使用 for 循环来打印值,那么为什么不使用它来分配值呢?(毕竟 toddlercollection 数组中的每个元素都具有相同的数据)。所以你可以做

for(int i =0; i < toddlercollection.length; i++)
{
    toddlercollection[i] =new babyMikeyToddler("Baby Mikey",10,2);
}

您在 for 循环中得到 NPE,因为 toddlercollection[3] 没有分配对象并且为空。然而,您正试图打印它的价值。其他我上面建议的总是在对其进行操作之前检查变量是否为 NULL。

例如。

    for(int i =0; i < toddlercollection.length; i++)
    {
        if(toddlercollection[i].getName() != null)
        {
            System.out.println(toddlercollection[i].getName());
        }

    }
于 2013-09-07T23:18:55.430 回答
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<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());
}
于 2013-09-07T22:32:06.393 回答