ResultSet 调用getString 抛出NullPointException问题的解决

当在Java中处理数据库查询时,使用ResultSet的getString方法可能会遇到NullPointerException,即使ResultSet对象本身不为空。这个问题通常由共享Statement或PrepareStatement实例引起。例如,连续执行两个查询,如果它们共用同一个Statement,可能导致第二个查询的ResultSet在调用getString时抛出异常。避免此问题的关键在于为每个ResultSet分配独立的Statement或PrepareStatement。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Java连接数据库时,有时候在ResultSet 调用getString (或其他类似的方法),有时候会抛出NullPointException,异常信息如下:

java.lang.NullPointerException
com.mysql.jdbc.ResultSetImpl.findColumn(ResultSetImpl.java:1059)
com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2719)
org.apache.jsp.delete_jsp._jspService(delete_jsp.java:110)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:337)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

但是通过debug发现ResultSet 对象不为空,这个问题就比较头疼,网上也有很多人在提问,但是大多都没有找到问题的根本原因。出现这个问题是因为多个ResultSet 使用了一个Statement或者PrepareStatement对象而导致,比如下面的代码:

Statement stat = conn.createStatement();
try {
     ResultSet rs = stat.executeQuery("select * from BbsRecord where id=" + id);
      rs.next();
      sid = rs.getInt("sid");
      ResultSet rss = stat.executeQuery("select * from bbsrecord where sid=" + sid);
      rss.last();
      if (rss.getRow() == 1) {
           if (rs.getInt("root") == 0) {  //错误报告指示的是这里
               stat.execute("update bbsrecord set leaf = 1 where id=" + sid);
               stat.execute("delete from bbsrecord where id =" + id);
               if (rs.getInt("leaf") == 0) {
                   delete(conn,id);
               }
           }
        } else {
           stat.execute("delete from bbsrecord where id =" + id);
           if (rs.getInt("leaf") == 0) {
                delete(conn, id);
           }
        }
        rs.close();
        rss.close();
} catch (SQLException e) {
     System.out.println("sql异常");
} finally {
     stat.close();
     conn.close(); 
}

 

 在上述代码中,由于第6行和第3行使用同一个Statement,导致了第9行抛出的NullPointerException异常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值