You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.01 02:27:29