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