繁体   English   中英

Java:数组索引超出范围

[英]Java: Array Index Out of Bounds

我得到这个例外:

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?

在for循环中,antalSetter在最后一个循环中增加到100-第一个例外,如果将数组长度增加到120-您正在访问索引为100的元素,该元素为空。

出现这两个例外是因为倒数第二行:

seter[antallSeter].addActionListener(lytteren);

在double for循环之外,其中antallSeter增量将超出antallSeter的现有( 第一个例外)或填充的( 第二个例外)索引的seter

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

// ..

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

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

}
rad++;
// etc ..

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

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

但是,永远不可能是j == 10 ,所以sete永远不会重置为0。我不知道这是不是导致异常的原因,但这绝对是您的代码有问题。 条件可能应该是if (j==9) { ...

用101大小初始化设置器。

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

在最后一个循环之后, antallSeter值为100。这是该行超出范围的索引:

seter[antallSeter].addActionListener(lytteren);

您可能应该移动以下行:

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

在外循环内。

暂无
暂无

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

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