Java:数组索引超出界限

时间:2012-02-06 21:22:45

标签: java arrays exception arraylist

我得到了这个例外:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 100
at Vindu.<init>(setevelger.java:64)
at setevelger.main(setevelger.java:22)

当我运行此代码时:

    public knapp seter[]=new knapp[100]; //knapp means button

    int rad=0; //rows
    int sete=0; //seats     
    int antallSeter=0; //number of seats
    for (int i=0;i<10;i++){
        for (int j=0;j<10;j++){
            seter[antallSeter]= new knapp("Rad "+(rad+1)+", Sete "+(sete+1));
            seter[antallSeter].setBackground(Color.GREEN);

            add(seter[antallSeter]); 
            antallSeter++;              
            if(j==10){
                sete=0;
                }else{              
                    sete++; 
                    }           
            }
        rad++;
        }   

    //creates an eventlistener
    Knappelytter lytteren = new Knappelytter();
    seter[antallSeter].addActionListener(lytteren);
    pack();     

如果我这样做:

public knapp seter[]=new knapp[120]; //knapp means button

我收到此错误:

Exception in thread "main" java.lang.NullPointerException
at Vindu.<init>(setevelger.java:64)
at setevelger.main(setevelger.java:22)

在创建窗口时,两个错误都会在运行时出现。

因此,代码应该创建100个按钮并将它们存储在一个数组中,每个按钮都有一个行和座位号。

我被困住了,我不知道在哪里看......

我是否应该使用arraylist?

5 个答案:

答案 0 :(得分:2)

在你的for循环中,antalSetter在上一个循环中增加到100 - 第一个异常,如果你将数组长度增加到120 - 你正在访问索引100处的null元素。

答案 1 :(得分:1)

两个例外都是因为倒数第二行:

seter[antallSeter].addActionListener(lytteren);

在double for循环之外,其中antallSeter将增加超过现有数量(1 st 异常)或填充(2 nd 例外)seter的索引。

如果我理解正确,并且您想为每个按钮添加一个事件监听器,您可以更改为:

// ..

    if(j == 10) {
        sete=0;
    } else {              
        sete++; 
    }

    seter[antallSeter].addActionListener(new Knappelytter());

}
rad++;
// etc ..

答案 2 :(得分:1)

在您的代码中,您有以下重置代码:

if (j==10) {
    sete=0;
} else {
    sete++;
}

然而,它永远不会是j == 10,所以sete永远不会被重置为0.我不知道这是否是导致异常的原因,但它肯定是您的代码的问题。条件应该是if (j==9) { ...

答案 3 :(得分:0)

在最后一个循环之后,antallSeter的值为100.这是一行超出界限的索引:

seter[antallSeter].addActionListener(lytteren);

你应该移动这些线:

Knappelytter lytteren = new Knappelytter();
seter[antallSeter].addActionListener(lytteren);

在外环内。

答案 4 :(得分:0)

以101尺寸初始化seter。

public knapp seter[]=new knapp[101];