一:问题程序代码及问题截图
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);
}
}
二:问题具体说明
<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
数组时出现了问题。