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

后来我需要使用变量,但它现在是超出范围,还是让我相信。我初始化try语句外的变量,并将其设置为null,我认为它可能然后被外界访问,但我仍然获得了NullPointerException

在代码如下,有很多它取出来,使阅读更容易 - 我知道这是不好的代码,但我是新来的Servlet和只是想看看它与所有移动部件做什么,他们都应该运行。

我已经创造了另一个类调用createDocs(...),并传入需要的参数,并能正常工作。所以这是让我好奇的是,为什么当我打电话rs.getString("name")我得到的NullPointerException,因为这正是我从其他类(从便利性的主要方法运行)做的,它按预期工作。

所讨论的变量是结果集变量 “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();
    }
}
有帮助吗?

解决方案

您的问题是,如果这样的说法:

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

抛出异常然后RS的值仍然null。因此,我会做的是移动相同的try-catch块内循环。另外,您可以检查它是否仍然是空尝试使用它之前。

设置到try-catch块外空值不坏代码虽然。这只是你需要做的,如果你想在try块之外的RS变量(并包括里面的catch子句之一)什么。你的RS while循环方式应该是相同的try块中。

其他提示

您在声明RS可变的方式与第一try / catch块是好的。

它只是第一的try / catch你必须记住,RS会的还是的为空,如果有在第一的try / catch错误后。因此,只要确保你测试空RS您尝试访问它。

你为什么不只是添加

if(rs != null)

while(rs.next())

此应该帮助(据我所知)

谢谢大家对你的帮助。首先,你帮我确定必须有某种异常被抛出。当我看着Tomcat的控制台,我可以看到这是一个类为MySQL连接器不提供资金的错误。我已经包含在我的项目,但不在项目本身 - 我只是懒洋洋地提到了它在我的lib目录中,所以最终的异常事件引起的问题,而是用你的建议,例如,如果(RS!= NULL)帮我弄根本原因。

起初,我还以为它有什么做的变量被淘汰的范围。显然,这不是它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top