我在代码中遇到了两个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
对于每个循环是唯一的 - 本地 - 它不会在其他地方改变。那么问题是什么?它必须是我忽略的一些简单的东西,但问题似乎令我感到困惑,我倾向于认为这是一个错误。
答案 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++)