【问题标题】:Java For() Loop Wrong Initial Value, Wrong Final Stopping PointJava For() 循环错误的初始值,错误的最终停止点
【发布时间】: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 &lt; 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


【解决方案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++)

【讨论】:

  • 你是对的,但即使我解决了这个问题(使用 biases[layerNumber - 1].set(i, 0, randomNum.nextGaussian()); 而不是 biases[layerNumber]--是我想要的)它仍然会出现同样的异常。实际上它说异常在第 43 行,程序中倒数第四个括号,这对我来说没有任何意义。
  • @abeta201 如果您在只是结束大括号 (}) 的行上遇到异常,那么您没有运行您正在查看的代码。记得重新编译你的代码。
  • @Andreas 这一定是正在发生的事情。 Eclipse 不会自动重新编译我的代码。关于如何强制它重新编译代码的任何想法?我可能只需要重新安装这个东西——我刚刚试图将它更新到火星。我想它并没有那么好。
  • Going to Project -> Build Automatically 似乎解决了这个问题。现在 Eclipse 终于再次重新编译了我的代码。
猜你喜欢
  • 2013-10-28
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
  • 1970-01-01
  • 2011-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多