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