2012-02-06 83 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