0

我的问题是我必须在 try 语句中设置一个变量,否则会出现编译错误。

稍后我需要使用该变量,但它现在超出了范围,或者我相信。我在 try 语句之外初始化变量并将其设置为 null,我认为它可能可以在外部访问,但我仍然得到一个NullPointerException.

代码在下面,为了便于阅读,去掉了很多代码——我知道这是不好的代码,但我是 Servlets 的新手,只是想看到它运行时所有移动部件都在做它们应该做的事情。

我创建了另一个调用 createDocs(...) 并传入所需参数的类,它工作正常。所以这让我很好奇为什么当我打电话时rs.getString("name")我得到了NullPointerException,因为这正是我在其他类中所做的(为了方便而从 main 方法运行)并且它按预期工作。

有问题的变量是 ResultSet 变量“rs” -

public class AgReportServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    public AgReportServlet() {
        super();
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ResultSet rs = null;
        try {
            rs = docs.getDocs(con, start, end, zone, locality);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        response.setContentType("text/xml");
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n" +
                out.println(
                        "<table border=\"0\" cellspacing=\"0\" cellpadding=\"6\">\n");

        // I have a resultset object need to iterate through it to display the file names

        try {
            while (rs.next()) { // page through the result set

                out.println(
                        "  <tr>\n" +
                                "    <td>: " + rs.getString("name") + "</td>\n" +
                                "  </tr>\n"
                );
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        out.println(
                "</table></body>\n" +
                        "</html>"
        );

        out.flush();
        out.close();
    }
}
4

4 回答 4

5

你的问题是,如果这个陈述:

rs = docs.getDocs(con, start, end, zone, locality);

抛出异常然后 rs 的值仍然是null. 所以我要做的是将循环移动到同一个 try-catch 块内。或者,您可以在尝试使用它之前检查它是否仍然为空。

不过,在 try-catch 块之外将值设置为 null 并不是坏代码。如果您希望 rs 变量在 try 块之外(并且包括在其中一个 catch 子句中),这就是您必须做的。您的 rs while 循环可能应该在同一个 try 块内。

于 2009-05-10T11:39:18.580 回答
4

您声明 rs 变量和第一个 try/catch 块的方式是可以的。

只是在第一次 try/catch 之后,您需要记住,如果第一次 try/catch 中出现错误,rs仍然为 null。因此,请确保在尝试访问之前测试 rs 是否为 null。

于 2009-05-10T11:44:26.680 回答
2

你为什么不简单地添加一个

if(rs != null)

while(rs.next())

这应该有帮助(据我了解)

于 2009-05-10T11:43:42.447 回答
0

感谢大家的帮助。首先,您帮助我确定必须抛出某种异常。当我查看 Tomcat 控制台时,我可以看到这是 MySQL 连接器的一个类不基金错误。我已经将它包含在我的项目中,但没有包含在项目本身中 - 我只是在我的 lib 目录中懒惰地引用它,所以最终异常导致了问题,但是使用你的建议,比如 if(rs != null) 帮助我得到到根本原因。

最初我认为这与变量超出范围有关。显然不是这样。

于 2009-05-10T12:01:48.487 回答