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

Java For() Loop Wrong Initial Value, Wrong Final Stopping Point

我 运行 在我的代码中遇到了两个 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());
            }
        }
    }
}

当我在测试仪中尝试 Foo obj = new Foo(1, 2, 1); 时,最终给了我一个 java.lang.ArrayIndexOutOfBoundsException: 2 class

所以我进入我的调试器,发现在第一个循环的第一轮,for(int layerNumber = 1; layerNumber < sizes.length; layerNumber++),变量 layerNumber = 0,不是我想要的 1。此外,在第二个循环的第一轮,layerNumber = 1,当它应该等于我指定的 0 时。最后,sizes.length,输入到构造函数中的整数的数量,在这个例子中显然是 3 (1, 2, 1),所以如果你有一个循环直到 layerNumber < sizes.length - 1 的 for 循环,在我的示例中,循环不应在 layerNumber = 2 时执行。但确实如此。它只在 layerNumber = 3 时跳过循环,这会导致 java.lang.ArrayIndexOutOfBoundsException: 2 错误。变量 layerNumber 对每个循环都是唯一的并且是局部的——它不会在其他地方改变。那么问题是什么?这一定是我忽略的简单问题,但问题看起来很复杂,我倾向于认为这是一个错误。

在这个循环中

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++)