2013-04-23 129 views
-1

我已經通過相同類型的其他一些問題看,並試圖找到答案,但我沒能看到什麼是錯的,如果有人可以點它對我來說將是偉大的!異常線程「main」 java.lang.ArrayIndexOutOfBoundsException:8

所以基本上我創建一個「記憶遊戲」中,我有一個默認背景圖片設置爲每個卡,但這一形象各有我再次運行時間來改變。另外,我需要使用前景圖像(21個)創建和排列列表,但每場只能使用8個。每次我運行程序時,他們也必須改變。這就是說,我走到這一步是:

public class GameBoard extends javax.swing.JPanel implements Runnable { 

    private JLabel[] _Labels = new JLabel[8]; 
    private Card[] _Cards = new Card[16]; 

    public GameBoard(){ 

     setLayout(new GridLayout(4, 4)); 

     for(int i = 0; i<8; i=i+1){ 

      _Labels[i] = new JLabel(); 

     } 

     for(int i = 0; i<16; i=i+2){ 

      _Cards[i] = new Card(_Labels[i]); 
      _Cards[i+1] = new Card(_Labels[i]); 

      add(_Cards[i].getLabel()); 
      add(_Cards[i+1].getLabel()); 

      _Labels[i].addMouseListener(new LabelListener(_Cards[i])); 
      _Labels[i+1].addMouseListener(new LabelListener(_Cards[i+1])); 

     } 

    } 

    @Override 
    public void run() { 


    } 

} 

卡類:

public class Card{ 

    private JLabel _Label; 

    ImageIcon imageOne; 

    ImageIcon imageTwo; 

    public Card(JLabel once){ 

     _Label = once; 

//-----------------------Foreground-------------------------------- 

     ArrayList<String> foregroundCard = new ArrayList<String>();  
     int i = 1; 
     while(i < 23){ 
      if(i > 9){ 
       String addGreaterNine = "F" + i + ".png"; 
       foregroundCard.add(addGreaterNine); 
      } 
      else{ 
       String addLesserNine = "F0" + i +".png"; 
       foregroundCard.add(addLesserNine); 
      } 
      i = i + 1; 
     } 

     //-----------------Add 8--------------------- 

     int a = 0; 

     while(a < 8){ 

      Collections.shuffle(foregroundCard); 

      ArrayList<String> stringsGoingToBeUsed = new ArrayList<String>();    
      stringsGoingToBeUsed.add(foregroundCard.get(0)); 
      stringsGoingToBeUsed.add(foregroundCard.get(0)); 

      for(int l = 0; l<16; l=l+1){ 

      Collections.shuffle(stringsGoingToBeUsed); 

      String frontName = "Images/" + stringsGoingToBeUsed.get(0); 
      imageOne = new ImageIcon(frontName); 

      } 

      a = a + 1; 

     }  


//------------------------Background--------------------------------   

     ArrayList<String> backgroundCard = new ArrayList<String>(); 
     backgroundCard.add("B01.png"); 
     backgroundCard.add("B02.png"); 
     backgroundCard.add("B03.png"); 
     Collections.shuffle(backgroundCard); 
     String location = "Images/" + backgroundCard.get(0); 
     imageTwo = new ImageIcon(location); 

//-------------------------------------------------------------------   

     _Label.setIcon(imageTwo); 

    } 
    public void TurnCard(){ 

     ImageIcon temp; 
     temp = imageTwo; 
     imageTwo = imageOne; 
     imageOne = temp; 
     _Label.setIcon(imageTwo); 

    } 

    public JLabel getLabel(){ 

     return _Label; 

    } 

} 

而且LabelListener類:

public class LabelListener implements MouseListener { 

    private Card _Card; 

    public LabelListener(Card c){ 

     _Card = c; 

    } 

    @Override 
    public void mouseClicked(MouseEvent arg0) { 

     _Card.TurnCard(); 

    } 

    @Override 
    public void mouseEntered(MouseEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseExited(MouseEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mousePressed(MouseEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseReleased(MouseEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

} 

的主要方法是:

public class Game { 
    public static void main(String[] args) { 

     JFrame main = new JFrame("Memory Game"); 
     main.add(new GameBoard()); 

     main.pack(); 
     main.setVisible(true); 
     main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    } 
} 
+0

-1不包括異常跟蹤(包括行號,並指向你就在錯誤)。 – 2013-04-23 02:43:43

回答

2

我懷疑這是因爲_Labels是具有8個元件的陣列,但是你嘗試在下面的代碼來引用高達16:

for(int i = 0; i<16; i=i+2){ 
    ... 
    _Labels[i+1].addMouseListener(new LabelListener(_Cards[i+1])); 
    ... 
+0

注意,這是一個運行時錯誤,而不是一個編譯錯誤(即Java將仍然編譯代碼,但只有一次,它的運行發生錯誤)。另外,生成的堆棧跟蹤應該會給出錯誤的行號,這將有助於您追蹤它。 – nullPainter 2013-04-23 02:29:29

0
for(int i = 0; i<16; i=i+2){ 

     _Cards[i] = new Card(_Labels[i]); 
     _Cards[i+1] = new Card(_Labels[i]); 

     add(_Cards[i].getLabel()); 
     add(_Cards[i+1].getLabel()); 

     _Labels[i].addMouseListener(new LabelListener(_Cards[i])); 
     _Labels[i+1].addMouseListener(new LabelListener(_Cards[i+1])); 

    } 

不工作作爲_Labels只是大小8的可能的解決方案將是本分割成單獨的循環或更改程序體系結構。

0

由於CardJLabel產生ArrayIndexOutOfBoundsException的數組項之間存在不匹配。代替_Cards使用的Java命名約定來命名變量,如cards:您可以添加其他指標j考慮到這一點:

for (int i = 0, j = 0; i < 16; i += 2, j++) { 

    _Cards[i] = new Card(_Labels[j]); // AIOOBE was happening here 
    _Cards[i + 1] = new Card(_Labels[j]); 

    add(_Cards[i].getLabel()); 
    add(_Cards[i + 1].getLabel()); 

    _Labels[j].addMouseListener(new LabelListener(_Cards[i])); 

    // not necessary 
    // _Labels[j + 1].addMouseListener(new LabelListener(_Cards[i + 1])); 
} 

除了。

相關問題