首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

JDBC 程式碼中缺少 catch 與 finally 區塊的補全寫法

     編輯:程式設計綜合問答

問題場景

在 JDBC 資料庫操作中,save 方法缺少異常處理與資源釋放程式碼,導致程式碼不完整且存在資源洩漏風險。

原始不完整代碼

public int save(Users users) {
    int i = 0;
    con = DatabaseDAO.getConnection();
    try {
        pt = con.prepareStatement("insert into users(...) values(?,?,...)");
        // 設定參數...
        i = pt.executeUpdate();
        return i; // 直接返回,缺少 catch 與 finally
    }
}

標準補全模板

public int save(Users users) {
    int i = 0;
    Connection con = null;
    PreparedStatement pt = null;
    try {
        con = DatabaseDAO.getConnection();
        pt = con.prepareStatement("insert into users(...) values(?,?,...)");
        // 設定參數...
        i = pt.executeUpdate();
        return i;
    } catch (SQLException e) {
        e.printStackTrace(); // 記錄異常堆疊
        // 可拋出自定義異常或返回錯誤碼
        throw new RuntimeException("資料庫操作失敗", e);
    } finally {
        // 確保資源關閉,避免洩漏
        DatabaseDAO.closePt(pt);
        DatabaseDAO.closeCon(con);
    }
}

關鍵點解析

1. 異常處理策略

  • 捕獲 SQLException 而非通用 Exception
  • 記錄堆疊追蹤便於除錯
  • 根據業務需求決定是吞掉異常、拋出運行時異常或轉換為業務異常

2. 資源管理原則

  • finally 區塊必須執行:無論是否拋出異常
  • 關閉順序:ResultSet → Statement → Connection
  • 每個關閉操作獨立 try-catch,防止其中一個失敗影響其他

3. 進階寫法:Try-with-resources (Java 7+)

public int save(Users users) {
    String sql = "insert into users(...) values(?,?,...)";
    try (Connection con = DatabaseDAO.getConnection();
         PreparedStatement pt = con.prepareStatement(sql)) {
        
        // 設定參數...
        return pt.executeUpdate();
    } catch (SQLException e) {
        throw new RuntimeException("資料庫操作失敗", e);
    }
    // 自動關閉資源,無需 finally
}

常見錯誤避坑指南

錯誤做法正確做法
catch 區塊為空至少記錄日誌或拋出異常
finally 中未關閉資源完整關閉所有 JDBC 資源
關閉資源順序錯誤遵循 ResultSet → Statement → Connection
連線未在 finally 關閉確保連線歸還連線池

總結

完整的 JDBC 操作必須包含:獲取連線 → 預編譯 SQL → 設定參數 → 執行 → 異常處理 → 資源釋放。使用 Try-with-resources 可大幅簡化代碼並提高安全性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved