Java JDBC调用Statement.executeQuery报NullPointerException异常求解
问题根因
你的代码初始化Statement对象的逻辑存在问题:声明Statement stmt = null后,调用conn.createStatement()时仅创建了Statement实例,但没有将返回的实例赋值给stmt变量,导致stmt始终为null,后续调用stmt.executeQuery(sql)时触发空指针异常,与Statement stmt = null的声明本身无关。
修正后的代码
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; class Database { public static void main(String args[]) { Connection conn = null; Statement stmt = null; ResultSet rs = null; try { Class.forName("com.mysql.cj.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost/test?useSSL=false&serverTimezone=Asia/Shanghai", "root", ""); System.out.println("DB CONNECTED!"); // 修正:将createStatement返回的实例赋值给stmt stmt = conn.createStatement(); String sql = "SELECT * FROM emp"; rs = stmt.executeQuery(sql); while (rs.next()) { System.out.println("I am " + rs.getString("name") + " and i live in " + rs.getString("city") + ". Btw i am " + rs.getInt("age") + " of age."); } } catch (Exception e) { e.printStackTrace(); } finally { // 补充资源关闭逻辑,避免资源泄漏 try { if(rs != null) rs.close(); if(stmt != null) stmt.close(); if(conn != null) conn.close(); } catch (Exception e) { e.printStackTrace(); } } } }
优化建议
- 优先使用try-with-resources语法管理JDBC资源,无需手动编写finally块关闭逻辑,可自动完成资源释放,避免遗漏导致的内存泄漏
- 数据库连接地址建议补充时区、SSL设置等参数,适配MySQL 8.0及以上版本的连接要求
- 不要将数据库账号密码硬编码在业务代码中,可通过配置文件、环境变量等方式读取敏感信息,降低数据泄露风险
内容的提问来源于stack exchange,提问作者HRWNdR
相关产品推荐
相关产品推荐

