Java编写数据库连接函数如何确保始终返回Connection对象
问题解决方法
核心思路
- 先将
Connection变量的声明提到try代码块外部,初始化为null,让变量作用域覆盖整个方法 - 方法所有分支都补充返回值:正常获取到连接返回有效对象,发生异常返回null(也可根据业务需求调整为抛出运行时异常,按需选择)
- 补充资源关闭逻辑,避免InputStream资源泄漏
修正后完整代码
import java.sql.Connection; import java.sql.DriverManager; import java.util.Properties; import java.io.InputStream; import java.io.IOException; public class ConnectDB { final String propfile = "/properties/db.properties"; public static void main(String[] args) { ConnectDB con = new ConnectDB(); Connection conn = con.connect(); // 后续可以使用conn进行数据库操作 } public Connection connect() { Connection cn = null; // 外部声明变量,作用域覆盖整个方法 InputStream propFile = null; try { propFile = this.getClass().getResourceAsStream(propfile); // 先判断配置文件是否读取成功,避免空指针 if (propFile == null) { throw new IOException("找不到数据库配置文件:" + propfile); } final Properties props = new Properties(System.getProperties()); props.load(propFile); cn = DriverManager.getConnection(props.getProperty("url"), props.getProperty("user"), props.getProperty("password")); } catch (Exception e) { System.out.println("connect ERROR :\n" + e.toString()); } finally { // 关闭输入流资源 if (propFile != null) { try { propFile.close(); } catch (IOException e) { e.printStackTrace(); } } } // 统一返回,不管是否异常都会走到这里 return cn; } }
代码修改说明
- 把
Connection cn的声明移到try块外,解决作用域无法在finally/方法末尾访问的问题 - 补充了配置文件为空的判断,避免空指针异常
- finally块里关闭InputStream资源,避免资源泄漏
- 方法末尾统一返回
cn变量:连接创建成功就返回有效连接对象,发生异常就返回null,满足「始终返回连接」的需求 - 修复了原代码缺少catch分支返回语句的编译错误
- 若不想返回null,也可在catch块中抛出运行时异常,让上层调用者显式处理连接失败的情况,比返回null更安全,能避免后续调用出现未捕获的空指针问题。
内容的提问来源于stack exchange,提问作者jonaskoennel
相关产品推荐
相关产品推荐

