【发布时间】:2016-03-23 07:03:03
【问题描述】:
我在代码中遇到了两个 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
所以我进入调试器,发现在第一个循环的第一轮for(int layerNumber = 1; layerNumber < sizes.length; layerNumber++),变量layerNumber = 0,而不是我想要的1。此外,在第二个循环的第一轮,layerNumber = 1,当它应该等于我指定的 0 时。最后,sizes.length,构造函数的输入整数的数量,在这个例子中显然是 3 (1, 2, 1),所以如果你有一个循环直到 layerNumber layerNumber = 2 时不执行。但确实如此。只有在layerNumber = 3 时才会跳过循环,这会导致java.lang.ArrayIndexOutOfBoundsException: 2 错误。变量layerNumber 对于每个循环和本地都是唯一的——它不会在其他地方更改。那么问题是什么?它一定是我忽略的一些简单的事情,但这个问题似乎很令人困惑,我倾向于认为这是一个错误。
【问题讨论】:
-
调用你的类
Object很可能会让很多人感到困惑,并且可能会在以后让你头疼,因为所有的类,包括你的Object类,都派生自java.lang.Object类,并且拥有一个Object类子类Object只是简单的混乱和容易出错。 -
你是对的。谢谢你。它现在被称为 Foo。
标签: java for-loop local-variables