首页 > 解决方案 > java - 即使首先初始化堆栈,线程“AWT-EventQueue-0”中的 Java JFrame 异常 java.util.EmptyStackException

问题描述

我正在 3 x 3 网格布局面板中创建一个数字益智游戏。首先我随机 8 个数字并将它们推入堆栈,然后弹出它们的值并将它们设置为按钮文本。应用程序运行良好,但有时我打印出此错误:java.util.Stack 的 java.util.Stack.peek(Stack.java:102) 的线程“AWT-EventQueue-0”java.util.EmptyStackException 中的异常。流行(堆栈.java:84)

它指向这行代码:buttons[i].setText(randomStack.pop() + "");

我知道这是多线程的问题,但我不知道,请帮助我。

    public Frame() {

        JPanel panel = new JPanel();
        Stack<Integer> randomStack = new Stack();

        while(randomStack.size() < 8) {
            int n = new Random().nextInt(8) + 1;

            if(!randomStack.contains(n)) {
                randomStack.push(n);
            }
        }


        panel.setLayout(new GridLayout(3, 3));
        panel.setPreferredSize(new Dimension(200 ,200));
        buttons = new JButton[9];

        for(int i = 0; i < 9; i++) {
            buttons[i] = new JButton();
            buttons[i].setSize(30, 30);
            panel.add(buttons[i]);

        }

        Random random = new Random();
        int n = random.nextInt(10);
        for(int i = 0; i < 9; i++) {
            if(i != n) {
               buttons[i].setText(randomStack.pop() + "");
            }
        }

        add(panel, BorderLayout.NORTH);

    }

    public static void main(String args[]) {

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Frame().setVisible(true);
        }
    });
}
}

标签: javamultithreading

解决方案


您放置了 8 个元素,然后尝试从堆栈中获取 9 个元素。这就是为什么你会得到一个例外。这与多线程无关,因为您的代码不会启动任何其他线程。而这段代码

Random random = new Random();
int n = random.nextInt(10);

可能导致n获得值 9,在这种情况下,您的 for 循环将迭代 9 次


推荐阅读