我的代码中遇到了两个 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(构造函数中输入整数的数量)在本示例中显然为 3 (1, 2, 1),因此,如果您有一个循环直到 layerNumber 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++)
关于Java For() 循环初始值错误,最终停止点错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36171701/