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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 06:48:03