0
点赞
收藏
分享

微信扫一扫

javaGUI程序中的一个错误异常Exception in thread "main" java.lang.NullPointerException: Cannot invoke "javax.swi

一:问题程序代码及问题截图

public class QuizGameGUI {
    public static void main(String[] args) {
        JFrame frame = new JFrame("答题游戏");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 300);
        frame.setDefaultCloseOperation(2);
        frame.setAlwaysOnTop(true);

        HashMap<String, String> questions = new HashMap<>();
        // 添加题目
        questions.put("Java的垃圾回收器有哪些?", "A.CMS, B.G1, C.Parallel, D.All of the above");
        questions.put("下面java中哪个修饰符的权限最大?", "A. public, B.private, C.protected, D.default");

        JPanel panel = new JPanel();
        frame.add(panel);

        // 设置布局
        panel.setLayout(new GridLayout(questions.size(), 2));

        // 添加题目和选项
        for (String key : questions.keySet()) {
            JLabel questionLabel = new JLabel(key);
            panel.add(questionLabel);

            JRadioButton[] options = new JRadioButton[questions.get(key).split(",").length];
            ButtonGroup group = new ButtonGroup();
            for (int i = 0; i < options.length; i++) {
                options[i] = new JRadioButton(options[i].getText());
                group.add(options[i]);
                panel.add(options[i]);
            }
            // 设置默认选中第一个选项
            options[0].setSelected(true);

            // 添加按钮监听器
            JButton submitButton = new JButton("提交答案");
            panel.add(submitButton);

            submitButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    // 判断答案
                    String correctAnswer = questions.get(key);
                    String selectedAnswer = null;
                    for (JRadioButton option : options) {
                        if (option.isSelected()) {
                            selectedAnswer = option.getText().replaceAll("\\s+", "");
                            break;
                        }
                    }
                    if (correctAnswer.contains(selectedAnswer)) {
                        JOptionPane.showMessageDialog(frame, "回答正确!");
                    } else {
                        JOptionPane.showMessageDialog(frame, "回答错误!");
                    }
                }
            });
        }
frame.setVisible(true);
    }
}

javaGUI程序中的一个错误异常Exception in thread "main" java.lang.NullPointerException: Cannot invoke "javax.swi_监听器

二:问题具体说明

<1>错误信息的分析

NullPointerException异常表明在QuizGameGUI类的main方法中,尝试访问options[i].getText()时,options[i]这个JRadioButton对象是null。这通常发生在尝试操作一个未正确初始化的GUI组件时。 错误发生在这一行代码中:

options[i].getText().replaceAll("\\s+", "");

<2>错误问题的解决办法

为了修复这个错误,我们需要确保在尝试访问options[i].getText()之前,options[i]是一个有效的JRadioButton实例。这通常意味着我们需要在为options数组分配值之前,确保对应的JRadioButton已经被创建和添加到面板中。 在您的代码中,options数组是在循环中创建的,但是并没有显示地将JRadioButton实例分配给options数组。为了修复这个问题,我们需要确保每个JRadioButton都被正确地创建并添加到options数组中。 下面是修复后的代码片段:

// 添加题目和选项
for (String key : questions.keySet()) {
    JLabel questionLabel = new JLabel(key);
    panel.add(questionLabel);
    
    JRadioButton[] options = new JRadioButton[questions.get(key).split(",").length];
    ButtonGroup group = new ButtonGroup();
    for (int i = 0; i < options.length; i++) {
        String optionText = questions.get(key).split(",")[i].trim();
        options[i] = new JRadioButton(optionText);
        group.add(options[i]);
        panel.add(options[i]);
    }
    
    // 设置默认选中第一个选项
    if (options.length > 0) {
        options[0].setSelected(true);
    }
    
    // 添加按钮监听器
    JButton submitButton = new JButton("提交答案");
    panel.add(submitButton);
    
    submitButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            // 判断答案
            String correctAnswer = questions.get(key);
            String selectedAnswer = null;
            for (JRadioButton option : options) {
                if (option.isSelected()) {
                    selectedAnswer = option.getText().replaceAll("\\s+", "");
                    break;
                }
            }
            if (correctAnswer.contains(selectedAnswer)) {
                JOptionPane.showMessageDialog(frame, "回答正确!");
            } else {
                JOptionPane.showMessageDialog(frame, "回答错误!");
            }
        }
    });
}

在这个修复的代码中,我添加了if (options.length > 0)检查,以确保在尝试设置默认选项之前options数组不为空。此外,我还添加了optionText.trim()来去除选项字符串后的空白符,这是split(",")方法可能遗留的问题。

请注意,这只是一个简单的修复,实际的错误可能源于其他地方。确保在程序的其他部分没有其他地方导致options[i]成为null的情况。如果问题仍然存在,您可能需要进一步检查代码以确定是否有其他地方在创建options数组时出现了问题。













举报

相关推荐

0 条评论