我的问题是我必须在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();
}
}
答案 0 :(得分:5)
你的问题是如果这句话:
rs = docs.getDocs(con, start, end, zone, locality);
抛出异常,然后rs的值仍为null
。所以我要做的是将循环移动到同一个try-catch块中。或者,您可以在尝试使用它之前检查它是否仍然为空。
尽管在try-catch块之外将值设置为null也不错。如果你想在try块之外使用rs变量(并且包含其中一个catch子句),那就是你必须要做的。你的rs while循环应该只是在同一个try块中。
答案 1 :(得分:4)
你声明rs变量和第一个try / catch块的方式还可以。
只是在第一次尝试/捕获后你需要记住,如果第一次尝试/捕获时出现错误,rs 仍然为空。因此,在尝试访问它之前,请确保测试rs为null。
答案 2 :(得分:2)
为什么不简单地添加
if(rs != null)
前
while(rs.next())
这应该有用(据我所知)
答案 3 :(得分:0)
感谢大家的帮助。首先,你帮助我确定必须抛出某种异常。当我查看Tomcat控制台时,我发现它是MySQL连接器的一个类而非基金错误。我把它包含在我的项目中,但不包括在项目本身内 - 我只是懒得在我的lib目录中引用它,所以最终异常引起了问题,但是使用你的建议如if(rs!= null)帮助我获得根本原因。
最初我认为它与变量超出范围有关。显然不是这样。