-3

我正在用java制作在线考试项目。我面临一个问题。

在开始时,我的数据库中有 15 个问题,我正在按顺序获取这些问题。问题是,如果我尝试所有答案,我会得到结果,否则我会得到error 500and NullPointerException。题目为多项选择题。每个问题都有四个选项。如果我不尝试所有问题,那么我会收到上述错误。

<%@page import="java.sql.*"%>

<%
    String st[] = new String[20];
    String ans[] = new String[20];
    int k=0;
    //int length = Integer.parseInt(request.getAttribute("length").toString());
    for (int i = 0; i < 15; i++)
    {
        int j = i + 1;
        st[i] = request.getParameter("radio" + j);
        System.out.println(st[i]);
    }
    Class.forName("oracle.jdbc.OracleDriver");
    Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "root", "root");
    Statement stmt = connection.createStatement();
    ResultSet rs = stmt.executeQuery("Select ANS from ANSWERS order by ID");
    //String ans = "";
    int t;
    while (rs.next()) {

        ans[k] = rs.getString("ans");
        k++;
        System.out.println(ans[k]);
    }

    int count = 0;
    //String answers[] = ans.split(" ");
    for (int i = 0; i < 15; i++) {
        if (st[i].equals(ans[i])) {
            count++;
        }

    }
    out.println("Your " + count + " answers are correct");
%>
4

3 回答 3

0

我想说的是,您的答案根本没有随您的请求一起提交。如果问题的单选组没有选定的值,则该单选组不会成为您在表单提交后处理的 POST 请求的一部分。

这就是为什么你首先得到空指针异常的原因。我无法运行您上面的示例,但我假设错误发生在示例末尾的比较行中:

if (st[i].equals(ans[i])) {

更新
为了快速修复,只需将评估值切换st[i].equals(ans[i])ans[i].equals(st[i]). 这样,您始终可以对 null 进行等于并获得正确的计数。

于 2012-08-22T07:35:20.493 回答
0

在您的代码开始时,您正在初始化您st[]request.getParameter("radio" + j);This 可能为空。根据javadocgetParameter():_

将请求参数的值作为字符串返回,如果参数不存在,则返回 null。

因此,当您尝试执行以下代码时:

for (int i = 0; i < 15; i++) {
    if (st[i].equals(ans[i])) {
        count++;
    }
}

st[i]事实上有一个机会null。这可能NullPointerException您的代码中出现的原因

于 2012-08-22T07:36:28.637 回答
0

您应该将您的逻辑包含在 try catch 中,并最终处理连接的 SQL 异常,rs (在单独的 try catch 块中)此外,尝试查看堆栈跟踪,关于哪一行给出空指针异常

于 2012-08-22T07:40:08.383 回答