java - 线程 "main"java.lang.ArrayIndexOutOfBoundsException : 8 中的异常

标签 java compiler-errors

我已经查看了其他一些相同类型的问题并试图找到答案,但我无法看到哪里出了问题,如果有人可以为我指出,那就太好了!

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

    }
}

最佳答案

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

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

关于java - 线程 "main"java.lang.ArrayIndexOutOfBoundsException : 8 中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16159872/

相关文章:

java - 更改单个 JList 值上的光标

java - 自定义 View 调用了 setOnTouchListener 但没有覆盖 performClick(类扩展 Activity NOT View)

c++ - Qt jom.exe错误2

c++ - 静态类成员显示令人困惑的语法错误

macos - ld : symbol(s) not found when linking

c++ - "invalid use of member"尝试使用我的功能时

r - 有没有办法解决make rstan的错误

java - 将数组对象添加到列表

java - 使用 .andThen 时,Byte Buddy 不保留返回值

java - Eclipse 数据库连接驱动程序定义