我遇到以下方法的问题。它应该创建一个数组,用对象填充它,并返回填充的数组。但是,由于我不知道的原因,返回的数组充满了空值。
public Rodent[] getRodents(int amount) {
Random rng = new Random();
Rodent[] rodentArray = new Rodent[amount];
for (Rodent r : rodentArray) {
switch (rng.nextInt(3)) {
case 0:
r = new Mouse(); // Subclass of Rodent
break;
case 1:
r = new Gebril(); // Subclass of Rodent
break;
case 2:
r = new Hamster(); // Subclass of Rodent
break;
default:
r = new Rodent(); // For safety
}
System.out.println(r.getName()); // Test command inside the loop. Prints the name of all object correctly.
}
for (Rodent r : rodentArray) { // Test loop outside of previous loop.
System.out.println(r.getName()); // Throws null pointer exception.
}
return rodentArray; // Returns null filled array
}
编辑:
找到我的答案。谢谢。现在我需要停止像指针那样考虑增强的for循环。
答案 0 :(得分:4)
r
是循环中的局部变量,在给定的迭代之外不存在。您的代码等同于下面的代码,可能更容易看到在每次迭代结束时丢弃r
:
for (int i = 0; i < rodentArray.length; i++) {
Rodent r = rodentArray[i];
//your switch here
}
因此,在您的情况下,您可能应该使用标准for循环并使用rodentArray[i] = new Mouse();
或其他动物填充数组。
答案 1 :(得分:0)
您永远不会将新创建的啮齿动物对象放入数组中。这是正确的代码 -
public Rodent[] getRodents(int amount) {
Random rng = new Random();
Rodent[] rodentArray = new Rodent[amount];
for(int count = 0; count < rodentArray.length; count++) {
Rodent r;
switch (rng.nextInt(3)) {
case 0:
r = new Mouse(); // Subclass of Rodent
break;
case 1:
r = new Gebril(); // Subclass of Rodent
break;
case 2:
r = new Hamster(); // Subclass of Rodent
break;
default:
r = new Rodent(); // For safety
}
rodentArray[count] = r;
System.out.println(r.getName()); // Test command inside the loop. Prints the name of all object correctly.
}
for (Rodent r : rodentArray) { // Test loop outside of previous loop.
System.out.println(r.getName()); // Throws null pointer exception.
}
return rodentArray; // Returns null filled array
}