Java For()循环错误的初始值,错误的最终停止点

时间:2016-03-23 07:03:03

标签: java for-loop local-variables

我在代码中遇到了两个for()循环的问题:

public class Foo
{
    private int numLayers;
    private int[] sizes;
    private Matrix[] biases;
    private Matrix[] weights;

    public Foo(int... sizes)
    {
        this.numLayers = sizes.length;
        this.sizes = sizes;
        this.weights = new Matrix[sizes.length - 1];
        this.biases = new Matrix[sizes.length - 1];
        Random randomNum = new Random();
        for(int layerNumber = 1; layerNumber < sizes.length; layerNumber++)
        {
            this.biases[layerNumber - 1] = new Matrix(sizes[layerNumber], 1);
            for(int i = 0; i < biases[layerNumber - 1].getHeight(); i++)
            {
                biases[layerNumber - 1].set(i, 0, randomNum.nextGaussian());
            }
        }
        for(int layerNumber = 0; layerNumber < sizes.length - 1; layerNumber++)
        {
            this.weights[layerNumber] = new Matrix(sizes[layerNumber + 1], sizes[layerNumber]);
            for(int i = 0; i < weights[layerNumber].getHeight(); i++)
            {
                for(int j = 0; j < weights[layerNumber].getWidth(); j++)
                    weights[layerNumber].set(i, j, randomNum.nextGaussian());
            }
        }
    }
}

当我在测试人员课程中尝试java.lang.ArrayIndexOutOfBoundsException: 2时,最后给了我Foo obj = new Foo(1, 2, 1);

所以我进入我的调试器,发现在第一个循环的第一轮for(int layerNumber = 1; layerNumber < sizes.length; layerNumber++),变量layerNumber = 0,而不是我想要的1。此外,在第二个循环的第一轮layerNumber = 1,它应该等于我指定的0。最后,在这个例子中,sizes.length(构造函数中输入int的数量)显然是3(1,2,1),所以如果你有一个for循环直到layerNumber&lt; sizes.length - 1,在我的示例中layerNumber = 2时,循环不应该执行。但确实如此。它仅在layerNumber = 3时跳过循环,这会导致java.lang.ArrayIndexOutOfBoundsException: 2错误。变量layerNumber对于每个循环是唯一的 - 本地 - 它不会在其他地方改变。那么问题是什么?它必须是我忽略的一些简单的东西,但问题似乎令我感到困惑,我倾向于认为这是一个错误。

1 个答案:

答案 0 :(得分:1)

在这个循环中

for(int layerNumber = 1; layerNumber < sizes.length; layerNumber++)

layerNumber达到sizes.length - 1

此时biases[layerNumber]超出范围,因为biases的长度为sizes.length - 1,因此其最大索引为sizes.length - 2

也许您希望该循环的范围与第二个循环的范围相同:

for(int layerNumber = 1; layerNumber < sizes.length - 1; layerNumber++)