You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JDBC出现Java.lang.NullPointerException求助:JSP代码ResultSet取值异常

问题分析与解决方案

首先,我看到你的代码里有两个关键问题导致了这个NullPointerException:

1. Statement对象创建错误

你用con.prepareStatement(query)获取Statement对象,但prepareStatement()返回的是PreparedStatement类型,不是Statement。而且你执行查询时还传了query参数给st.executeQuery(query),这会导致预编译的PreparedStatement被误用,可能让ResultSet的行为异常,甚至重复执行查询,干扰结果集的指针状态。

2. 未处理rs.getString(1)为null的情况

虽然你打印rs.getString(1)时显示正常,但如果数据库中name字段的值是null,rs.getString(1)会返回null。这时候调用null.equals(nam)就会直接抛出NullPointerException——因为你不能对null对象调用方法。


修正后的代码

String nam = request.getParameter("n"); 
String query = "select name from ques where username=?"; 
// 使用PreparedStatement,避免SQL注入,同时纠正对象类型
PreparedStatement st = con.prepareStatement(query);
// 设置参数,替换占位符
st.setString(1, userid);
ResultSet rs = st.executeQuery(); 

while(rs.next()){ 
    String dbName = rs.getString(1);
    out.println(dbName); 
    // 先判断dbName不为null,再调用equals,避免空指针
    if(dbName != null && dbName.equals(nam)){ 
        out.print("hello"); 
    }
    // 或者更简洁的安全方式(Java 7+可用):
    // if(Objects.equals(dbName, nam)){
    //     out.print("hello");
    // }
}

额外说明

  • 使用PreparedStatement不仅能修复当前的ResultSet问题,还能防止SQL注入,这是Java数据库操作的最佳实践。
  • 把rs.getString(1)的结果先赋值给局部变量,既避免重复调用ResultSet方法,也让代码更清晰,方便做null判断。
  • 如果nam也可能为null(比如用户没传n参数),Objects.equals(dbName, nam)是最安全的选择——它会自动处理两边都是null的情况,不会抛出异常。

内容的提问来源于stack exchange,提问作者vikas Madaan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:48:04