无法调用“java.sql.Connection.close()”,因为“conn”为空
时间: 2024-04-23 11:24:31 浏览: 79
这个错误提示说明在你的代码中,你调用了一个空的数据库连接对象的 close() 方法,而这个方法只能被一个有效的连接对象调用。你需要检查一下你的代码逻辑,确保在调用 close() 方法之前,你已经成功地创建了一个数据库连接对象,并且该对象已经成功地连接到了数据库。如果仍然存在问题,你可以在代码中添加一些调试信息来帮助你找出问题的根源并解决它。
相关问题
package studentsSystem; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Properties; import javax.sql.DataSource; import com.alibaba.druid.pool.DruidDataSourceFactory; public class system { public static void main(String[] args) throws Exception{ // TODO Auto-generated method stub; Properties prop=new Properties(); prop.load(new FileInputStream("shixun/src/druid.properties")); DataSource dataSource=DruidDataSourceFactory.createDataSource(prop); Connection conn=dataSource.getConnection(); String sql="update student set 姓名=王五 where 学号=01"; PreparedStatement pstm=conn.prepareStatement(sql); ResultSet rs=pstm.executeQuery(); pstm.close(); conn.close(); } }
这段代码的作用是使用阿里巴巴的 Druid 数据库连接池框架连接到数据库,并执行一个 SQL 更新语句,将学号为 01 的学生的姓名修改为“王五”。
具体实现步骤如下:
1. 读取数据库连接池的配置信息,这些信息保存在 "druid.properties" 文件中。
2. 使用 DruidDataSourceFactory.createDataSource(prop) 方法创建一个 Druid 数据库连接池。
3. 调用 dataSource.getConnection() 方法获取一个数据库连接对象。
4. 构造一个 SQL 更新语句,将学号为 01 的学生的姓名修改为“王五”。
5. 通过调用 conn.prepareStatement(sql) 方法创建一个 PreparedStatement 对象,然后执行更新操作。
6. 最后关闭 PreparedStatement 对象和数据库连接对象。
需要注意的是,这段代码中的 SQL 更新语句没有使用 PreparedStatement 对象的 setXXX 方法设置参数值,这是不规范的做法,容易引起 SQL 注入等安全问题。正确的做法应该是使用 PreparedStatement 对象的 setXXX 方法来设置参数值,如下所示:
```
String sql="update student set 姓名=? where 学号=?";
PreparedStatement pstm=conn.prepareStatement(sql);
pstm.setString(1, "王五");
pstm.setString(2, "01");
pstm.executeUpdate();
```
package com.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class DBConn { Connection conn; Statement stmt; ResultSet rs; //返回值 参数 public void openDB(){ try { Class.forName("com.mysql.cj.jdbc.Driver"); String url="jdbc:mysql://localhost:3306/test?useSSL=fasle&serverTimezone==GMT%2B8"; conn = DriverManager.getConnection(url,"root","123456"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public int execUpdate(String sql){ int n=0; try { stmt = conn.createStatement(); n = stmt.executeUpdate(sql); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return n; } public void closeDB(){ try { stmt.close(); conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }找错误
这段代码看起来没有明显错误,但是在使用之前需要先调用 openDB 方法来打开数据库连接。如果没有调用 openDB 方法就直接调用 execUpdate 方法,就会出现空指针异常,因为 conn 对象还没有被初始化。因此,在使用 DBConn 类的时候,需要按照以下步骤来操作:
1. 创建 DBConn 对象。
2. 调用 openDB 方法来打开数据库连接。
3. 调用 execUpdate 方法来执行 SQL 语句。
4. 调用 closeDB 方法来关闭数据库连接。
如果你已经按照以上步骤来使用 DBConn 类,但仍然出现错误,可以检查以下几个方面:
1. 检查数据库连接字符串是否正确。
2. 检查数据库用户名和密码是否正确。
3. 检查是否有足够的权限来访问数据库。
4. 检查 SQL 语句是否正确。
如果还无法解决问题,可以考虑将错误信息打印出来,以便更好地定位问题。