Array方法返回所有null元素而不是object元素

时间:2014-04-20 18:40:21

标签: java arrays

我遇到以下方法的问题。它应该创建一个数组,用对象填充它,并返回填充的数组。但是,由于我不知道的原因,返回的数组充满了空值。

 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循环。

2 个答案:

答案 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
}