2012-02-06 70 views
0

的数组索引我得到这个异常:的Java:边界

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?

+0

请告诉我们在文件setevelger.java中是第64行 – 2012-02-06 21:27:48

+2

“j == 10”怎么会是真的? – Gevorg 2012-02-06 21:30:30

+0

这不是真的回答你的问题,但它会有所帮助。你的循环中有'if(j == 10)',表示'..; j <10; ..'这意味着j永远不会等于10.另外,除非它们在你的循环之外使用'sete'和'rad'不需要,你可以使用'i'和'j'。 ''rad“+(i + 1)+”,Sete“+(j + 1));'那么你不需要'antallSeter ++之后的部分;' – Shaded 2012-02-06 21:31:43

回答

2

在您的周期antalSetter在最后一个周期增加至100 - 第一个例外,如果将数组长度增加到120,则您在索引100处访问为空的元素。

+0

为什么你测试j == 10?一些微观最优化:)? – 2012-02-06 21:31:04

+0

进出口测试,因为我想要每个座位都有一个座位号,并且每行应该有10个座位,所以当j == 10时,以便下一行从0开始再次:) – TM89 2012-02-06 21:40:16

+0

您测试的内容用于循环条件评估相位 (int j = 0; j <10; j ++) - 没有办法如何j == 10,不需要sete变量,用j代替 – 2012-02-06 21:53:11

0

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

seter[antallSeter].addActionListener(lytteren); 

你或许应该移动行:

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

里面的外环。

1

两个异常发生,因为倒数第二行:

seter[antallSeter].addActionListener(lytteren); 

是双for环,其中antallSeter将已经递增超出现有的(1 ST除外)的数目之外,或填充的(2 nd例外)指数为seter

如果我理解正确的话,你想一个事件侦听器添加到每一个按钮,你可以改变为:

// .. 

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

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

} 
rad++; 
// etc .. 
1

在代码中,你有这样的复位代码:

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

然而,它永远是j == 10,所以sete永远不会被重置为0,我不知道这是什么引起的异常,但它绝对是你的代码的一个问题。条件应该可能是if (j==9) { ...

0

用101尺寸初始化seter。

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

带100个按钮的数组不需要大小为101的元素 – 2015-09-25 06:29:21