JDBC,一个Servlet从数据库获取数据,为什么会出现500错误?

若谷. Java开发  2015-12-09 11:20:17
package jdbc.one;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class PersonServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

Connection con=null;
Statement st=null;
ResultSet rs=null;
try{
Class.forName("com.mysql.jdbc.Driver");
}catch(ClassNotFoundException e){
e.printStackTrace();
System.out.println("驱动程序加载错误");
}

try{
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/study","root","19951227");
st=con.createStatement();
rs=st.executeQuery("select* from person");

response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>列出人员信息表</TITLE></HEAD>");
out.println(" <BODY>");
out.print("<center><h4>人员信息列表</h4>");
out.print("<table border=\"1\" width=\100%\" cellpadding=\"2\" cellspacing=\"1\">");
out.print("<tr><td>选择</td>");
out.print("<td>姓名</td>");
out.print("<td>年龄</td>");
out.print("<td>性别</td>");
out.print("<td>生日</td>");
out.print("<td>备注</td></tr>");
while(rs.next()){
int id=rs.getInt("id");
String name=rs.getString("name");
int age=rs.getInt("age");
String sex=rs.getString("sex");
Date birthday=rs.getDate("birthday");
String description=rs.getString("description");
out.print("<tr>");
out.print("<td><input type=\"checkbox\" name=\"id\" value=\""+id+"\"></td>");
out.print("<td>"+name+"</td>");
out.print("<td>"+age+"</td>");
out.print("<td>"+sex+"</td>");
out.print("<td>"+birthday+"</td>");
out.print("<td>"+description+"</td>");
out.print("</tr>");
}
out.print("</table></center>");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}catch (SQLException e){
e.printStackTrace();
}finally{
try{
rs.close();
st.close();
con.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}

}

出现了java.lang.NullPointerException
jdbc.one.PersonServlet.doPost(PersonServlet.java:81)
jdbc.one.PersonServlet.doGet(PersonServlet.java:22)
javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
查了很久的百度,也没找到。代码的没问题的,可能是哪里出问题了。
...全文
284 点赞 收藏 9
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
小白晒太阳 2015-12-11
引用 5 楼 ycm2014ok 的回复:
[quote=引用 2 楼 Tro_picana 的回复:] rs.close(); st.close(); con.close(); 关闭语句严谨一点是要加上非空校验的 if (rs != null) rs.close(); ... 你加上非空校验后,再执行看看数据有没有,奇怪如果为null的话rs.next()在这里就应该报错了。。不会结果集遍历结束后自动会被关闭吧。。
果然可以了。为什么加上非空检验能有如此大的变化呢?如果rs为空的话,上面是获取不到数据的,如果rs不为空,获取到数据才关闭。逻辑上来说,就算不加这个非空检验,也是可以的,但为什么运行不了呢?[/quote]最好能看一下rs.next()方法的源码是怎么写的
回复
南猿北辙 2015-12-10
是的非空判断
回复
若谷. 2015-12-10
引用 2 楼 Tro_picana 的回复:
rs.close(); st.close(); con.close(); 关闭语句严谨一点是要加上非空校验的 if (rs != null) rs.close(); ... 你加上非空校验后,再执行看看数据有没有,奇怪如果为null的话rs.next()在这里就应该报错了。。不会结果集遍历结束后自动会被关闭吧。。
果然可以了。为什么加上非空检验能有如此大的变化呢?如果rs为空的话,上面是获取不到数据的,如果rs不为空,获取到数据才关闭。逻辑上来说,就算不加这个非空检验,也是可以的,但为什么运行不了呢?
回复
2L 说的对 RS非空判断
回复
ITjavaman 2015-12-10
同意楼上,应该是空对象
回复
小白晒太阳 2015-12-10
rs.close(); st.close(); con.close(); 关闭语句严谨一点是要加上非空校验的 if (rs != null) rs.close(); ... 你加上非空校验后,再执行看看数据有没有,奇怪如果为null的话rs.next()在这里就应该报错了。。不会结果集遍历结束后自动会被关闭吧。。
回复
Love_qq101 2015-12-10
你最后释放的话需要,先对rs先做判断
回复
百里非烟 2015-12-10
rs为空,rs.next()这样就会报错
回复
若谷. 2015-12-09
回复
相关推荐
发帖
Web 开发
创建于2007-09-28

8.0w+

社区成员

Java Web 开发
申请成为版主
帖子事件
创建了帖子
2015-12-09 11:20
社区公告
暂无公告