“线程中的异常”;“主要”;java.lang.ArrayIndexOutofBounds异常:8

“线程中的异常”;“主要”;java.lang.ArrayIndexOutofBounds异常:8,java,compiler-errors,Java,Compiler Errors,我看了一些其他类型的问题,试图找到答案,但我看不出有什么错,如果有人能为我指出,那就太好了 所以基本上,我正在创建一个“记忆游戏”,在这个游戏中,我必须为每张卡设置一个默认的背景图像,但是每次我再次运行它时,这个图像必须改变。此外,我还必须创建和阵列的前景图像列表(21),但我只会使用每场比赛8。每次我运行程序时,它们也必须更改。也就是说,到目前为止,我得到的是: public class GameBoard extends javax.swing.JPanel implements Runna

我看了一些其他类型的问题,试图找到答案,但我看不出有什么错,如果有人能为我指出,那就太好了

所以基本上,我正在创建一个“记忆游戏”,在这个游戏中,我必须为每张卡设置一个默认的背景图像,但是每次我再次运行它时,这个图像必须改变。此外,我还必须创建和阵列的前景图像列表(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 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);

    }
}

我怀疑这是因为
\u Labels
是一个包含8个元素的数组,但是您试图在以下代码中引用最多16个元素:

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

for(int i=0;i
for(int i=0;i因为
Card
JLabel
数组项的数量不匹配,这会产生
ArrayIndexOutOfBoundsException
。您可以添加另一个索引
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])); 
}
for(inti=0,j=0;i<16;i+=2,j++){
_卡片[i]=新卡片(_标签[j]);//这里发生了什么
_卡片[i+1]=新卡片(_标签[j]);
添加(_Cards[i].getLabel());
添加(_Cards[i+1].getLabel());
_Labels[j].addMouseListener(新LabelListener(_Cards[i]);
//没必要
//_标签[j+1].addMouseListener(新标签[i+1]);
}

旁白:使用Java命名约定来命名变量,例如
代替
\u卡

注意,这是一个运行时错误,而不是编译错误(即Java仍将编译代码,但错误仅在运行后发生)。此外,生成的堆栈跟踪应该给您错误的行号,这将帮助您跟踪错误。-1表示不包括异常跟踪(其中包括行号,并将您指向正确的错误)。
for(int i = 0; i<16; i=i+2){
    ...
    _Labels[i+1].addMouseListener(new LabelListener(_Cards[i+1]));
    ...
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]));

    }
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])); 
}