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
相关产品推荐
相关产品推荐

