繁体   English   中英

索引超出范围异常错误

[英]Index out of bounds exception error

我有以下代码,似乎在以下位上产生数组错误:

int run = 0;

    while(myNet.RunNet(q) > 0.2 && run < 1000) {

        myNet.TrainNet(templates, 10);
        run += 1;

    }

关键是,当我在循环外的模板上运行TrainNet时,它不会返回相同的错误...:S

public void SetInput(ArrayList<Double> inputs) {

    ArrayList<Neuron> inputNeurons = networkLayers.get(0).getLayerNeurons();

    for(int i = 0; i < inputNeurons.size(); i++) {

        inputNeurons.get(i).ResetInput();
        inputNeurons.get(i).ReceiveInput(inputs.get(i));

    }

}

哪个返回

java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at NeuralNet.Network.SetInput(Network.java:82)
at NeuralNet.Network.TrainNet(Network.java:100)
at nnTest.RunNet.main(RunNet.java:90)

对于:

ArrayList<Double> m = new ArrayList<Double>();
    m.add(0.0);
    m.add(0.0);
    m.add(0.0);

    ArrayList<Double> n = new ArrayList<Double>();
    n.add(1.0);
    n.add(1.0);
    n.add(0.0);

    ArrayList<Double> o = new ArrayList<Double>();
    o.add(1.0);
    o.add(0.0);
    o.add(1.0);

    ArrayList<Double> p = new ArrayList<Double>();
    p.add(1.0);
    p.add(1.0);
    p.add(1.0);

    ArrayList<ArrayList<Double>> templates = new ArrayList<ArrayList<Double>>();
    templates.add(m);
    templates.add(n);
    templates.add(o);
    templates.add(p);

通过解析

public void TrainNet(ArrayList<ArrayList<Double>> templates, int epochs) {


    int j = 1;

    for(ArrayList<Double> currentTemplate : templates) {
        System.out.println("------------------------");
        System.out.println("Testing through set " + j);
        j += 1;

        outputNeuron.setDesired(currentTemplate.get(0));
        currentTemplate.remove(0);
        SetInput(currentTemplate);

        for(int i = 0; i < epochs; i++) {

            FeedForward();
            BackPropagate();


        }

    }

}

public void SetInput(ArrayList<Double> inputs) {

    ArrayList<Neuron> inputNeurons = networkLayers.get(0).getLayerNeurons();

    for(int i = 0; i < inputNeurons.size(); i++) {

        inputNeurons.get(i).ResetInput();
        inputNeurons.get(i).ReceiveInput(inputs.get(i));

    }

}

有什么建议么? :)

inputNeurons.get(i).ReceiveInput(inputs.get(i));

使用inputs.get(i) ,您假设inputs至少具有与inputNeurons一样多的条目。 它可能不会,所以您超出了它的范围。

就在这儿:

inputNeurons.get(i).ReceiveInput(inputs.get(i));

您没有做任何事情来确保i可以inputs

最低限度,错误消息告诉您在哪里看:

java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at NeuralNet.Network.SetInput(Network.java:82)
at NeuralNet.Network.TrainNet(Network.java:100)
at nnTest.RunNet.main(RunNet.java:90)

NeuralNet.Network.SetInput java.util.ArrayList.rangeCheckjava.util.ArrayList.get引发了java.lang.IndexOutOfBoundsException ,这是您的代码,带有违规行号82 看第82行。 这是我上面突出显示的行。 这就是您调试此类问题的方式。

另外,我鼓励您训练自己如何连接调试器并在此类帮助下解决错误。

您的问题似乎在于以下语句:

inputNeurons.get(i).ReceiveInput(inputs.get(i));

我可能会超出输入范围。

您尝试过将循环条件更改为

我<inputNeurons.size()-1

如以下示例所示?

for(int i = 0; i<inputNeurons.size() - 1; i++) {
    inputNeurons.get(i).ResetInput();
    inputNeurons.get(i).ReceiveInput(inputs.get(i));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM