Java测验项目答案校验方法故障排查:选择正确答案后分数未增加
问题分析与解决方案
我来帮你拆解一下你的测验项目里check()方法不加分的问题,核心是调用时机错了,再加上一些细节逻辑漏洞,咱们一步步解决:
1. 最关键的问题:check()方法调用时机完全错误
看你的m()方法,刚从数据库拉取完题目、设置完选项文本,立刻就调用了check(answer)——这时候用户还没来得及选任何选项啊!你刚执行了bg.clearSelection()清空了所有单选按钮的选中状态,所以check()里的所有if/else if分支都不会触发,marks自然不会增加。
正确做法:check()方法应该绑定到用户的"提交答案"操作上,比如给提交按钮加事件监听,等用户选完答案点击按钮时再调用。示例代码:
// 假设你有一个提交按钮submitBtn submitBtn.addActionListener(e -> { // 调用校验方法,传入当前题目的正确答案 check(answer); // 校验完成后加载下一题 m(); });
2. check()方法的逻辑漏洞优化
就算调用时机对了,原方法还有几个细节要调整:
- 答案格式不匹配风险:要确认数据库
answer字段存的内容和你对比的内容一致。比如如果数据库存的是选项编号(比如"1"对应r1),但你拿它和r1.getText()的选项文本对比,肯定不会相等,这时候选对了也不会加分。要么数据库存选项文本,要么修改对比逻辑(比如选中r1时对比ans是否等于"1")。 - 未选选项的处理:原方法没处理用户没选任何选项的情况,可以加个提示避免无意义操作。
- 冗余变量清理:原方法里
stuans变量定义了但没用到,要么删掉要么用来存储用户答案方便调试。
修改后的check()方法参考:
public void check(String ans) { String userAnswer = ""; // 获取用户选中的答案 if (r1.isSelected()) { userAnswer = r1.getText(); // 如果数据库存的是选项编号,就改成 userAnswer = "1"; } else if (r2.isSelected()) { userAnswer = r2.getText(); // userAnswer = "2"; } else if (r3.isSelected()) { userAnswer = r3.getText(); // userAnswer = "3"; } else if (r4.isSelected()) { userAnswer = r4.getText(); // userAnswer = "4"; } else { JOptionPane.showMessageDialog(null, "请先选择一个选项!"); return; } // 校验答案并更新分数 if (ans.equals(userAnswer)) { marks += 1; JOptionPane.showMessageDialog(null, "答对啦!当前分数:" + marks); } else { JOptionPane.showMessageDialog(null, "答错了,正确答案是:" + ans); } System.out.println("当前分数:" + marks); }
3. 其他潜在问题提示
marks变量的作用域:确保marks是类的成员变量,并且初始化为0,如果是局部变量的话,每次调用都会重置为0,无法累计分数。- SQL注入风险:你的
m()方法里用"Select * from quiz.qs where qid="+ Random()拼接SQL,存在SQL注入风险,建议改用PreparedStatement:
String sql = "Select * from quiz.qs where qid=?"; PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setInt(1, Random()); // 假设Random()返回int类型的qid ResultSet rs1 = pstmt.executeQuery();
调整完这些,应该就能正常统计分数了!
内容的提问来源于stack exchange,提问作者Ammar
相关产品推荐
相关产品推荐

