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

标签 java for-loop local-variables

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

关于Java For() 循环初始值错误,最终停止点错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36171701/

相关文章:

java - 无法在 Eclipse 中找到 svn 选项?

javascript - 使循环和代码更有效地使用循环处理大量数字

java - java中如何获取最大值?

java - Java编程时如何处理异常?

Java调试工具

java - 无法使用 Swing 登录

python - 如何找到所有可能的方法将字符串划分为 n 个切片而无需递归?

Python:如何让 eval() 看到局部变量?

java - 内部类和局部变量

java - 未使用的局部变量 Java 8 - java.lang.VerifyError : Inconsistent stackmap frames