Java从MySQL数据库取列值到变量遇空指针问题求助
问题分析与修正方法
核心问题点
- PreparedStatement未设置占位符参数:SQL语句里的
?是占位符,但你没有给它赋值,导致查询条件无效,大概率查不到数据,resultSet.next()返回false,_name没被赋值,最终触发NullPointerException。 - 错误调用
executeQuery(query):PreparedStatement的executeQuery()不需要传入SQL字符串,调用带参数的重载方法会让它退化为普通Statement,失去预编译功能,同时之前的参数设置也不会生效。 - ResultSet字段索引错误:你查询的是
username, passphrase两个字段,ResultSet的字段索引从1开始,所以username对应索引1,passphrase对应索引2,用索引3会抛出越界异常,进一步导致流程异常。 - 资源关闭逻辑错误:catch块里直接操作resultSet和statement,它们可能为null,会触发新的NullPointerException;assert语句毫无意义,反而会导致程序终止。
修正后的代码
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class DBExample { private String _name; private String _pass_phrase; public void fetchUser(String targetUsername) { // 使用try-with-resources自动关闭资源,无需手动调用close try (Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/Login", "root", "****"); PreparedStatement statement = connection.prepareStatement("Select username, passphrase from student where username=?")) { // 给占位符设置参数,索引从1开始 statement.setString(1, targetUsername); // 调用无参的executeQuery try (ResultSet resultSet = statement.executeQuery()) { if (resultSet.next()) { // 对应查询的字段索引,1是username,2是passphrase _name = resultSet.getString(1); _pass_phrase = resultSet.getString(2); } else { // 处理查询不到数据的情况,避免变量为null System.out.println("未找到指定用户"); _name = ""; _pass_phrase = ""; } } } catch (ClassNotFoundException e) { System.out.println("找不到MySQL驱动类"); e.printStackTrace(); } catch (SQLException e) { System.out.println("数据库操作异常"); e.printStackTrace(); } } }
额外注意事项
- 优先使用字段名称而非索引获取结果,比如
resultSet.getString("username"),这样即使SQL字段顺序变化,代码也不会出错。 - 必须处理查询不到数据的场景,避免变量始终为null导致后续空指针。
- try-with-resources会自动关闭实现AutoCloseable接口的资源(Connection、PreparedStatement、ResultSet都实现了),无需手动调用close,避免资源泄漏。
内容的提问来源于stack exchange,提问作者user17893652
相关产品推荐
相关产品推荐

