题
我的问题是,我必须设置在一个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)帮我弄根本原因。
起初,我还以为它有什么做的变量被淘汰的范围。显然,这不是它。