初学者求助:java.lang.NullPointerException异常(无法调用Connection.createStatement())
解决java.lang.NullPointerException: Cannot invoke "java.sql.Connection.createStatement()"
异常本质
这个异常的核心是:你调用createStatement()时,所用的Connection数据库连接对象是null——也就是说你还没成功创建或获取到有效的数据库连接,就直接调用了它的方法。
排查与修复步骤
1. 检查连接获取代码的有效性
先定位到你获取Connection的代码段(比如用DriverManager.getConnection()或数据源获取的部分),确认这部分是否正常返回了有效连接:
// 错误示例:未处理连接失败的情况,conn可能保持null Connection conn = null; try { Class.forName("com.mysql.cj.jdbc.Driver"); // 若URL、用户名、密码错误,会抛出SQLException,conn仍为null conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db", "user", "pass"); } catch (ClassNotFoundException | SQLException e) { // 仅打印日志不处理,conn会维持null状态 e.printStackTrace(); } // 此时conn为null,调用createStatement()必抛异常 Statement stmt = conn.createStatement();
2. 确保连接有效后再执行方法
必须在确认Connection不为null后,再调用createStatement(),同时正确处理异常:
Connection conn = null; Statement stmt = null; try { Class.forName("com.mysql.cj.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db", "user", "pass"); // 先判断连接是否有效,再执行后续操作 if (conn != null) { stmt = conn.createStatement(); // 执行SQL查询/更新等操作 } else { System.out.println("数据库连接创建失败"); } } catch (ClassNotFoundException e) { System.out.println("找不到JDBC驱动类"); e.printStackTrace(); } catch (SQLException e) { System.out.println("数据库连接失败:" + e.getMessage()); e.printStackTrace(); } finally { // 务必关闭资源,避免内存泄漏 try { if (stmt != null) stmt.close(); if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } }
3. 核查连接相关配置
- 确认JDBC URL格式正确(比如MySQL需带时区参数:
jdbc:mysql://localhost:3306/db?serverTimezone=UTC) - 数据库用户名、密码是否正确
- 数据库服务是否正常启动,端口是否开放
- JDBC驱动依赖是否正确引入(比如Maven项目需添加对应驱动的依赖坐标)
4. 不要忽略异常反馈
很多初学者会在catch块只打印日志,却没意识到此时连接已创建失败,后续代码仍会执行并触发空指针。要在异常处理中明确标记连接失败的状态,避免无效代码继续执行。
内容的提问来源于stack exchange,提问作者amy
相关产品推荐
相关产品推荐

