【问题标题】:Try-with-resource 'must be a variable declaration' [duplicate]Try-with-resource'必须是变量声明'[重复]
【发布时间】:2020-06-05 12:13:52
【问题描述】:

所以我使用 JDBC 连接到本地主机 MySQL 服务器,当我编写 try 块以连接服务器并发送查询时,我收到 'Cannot find symbol' 错误。

我知道这是因为对象是在 try 条件内初始化的,我试图从 finally 条件中使用它,但我也无法在 try 块之外初始化它,因为我收到一条错误消息 'The try-with-resources resource must be a variable declaration or an expression denoting to a final or effectively final variable'

我试图编写代码的总体思路是能够在 finally 块中关闭与数据库的连接,无论是否引发异常。有问题的代码如下(突出显示错误的行):

public static String returnEmployeeName(String ID) throws ClassNotFoundException, SQLException {
    HashMap<String, String> infoHR = connectionInfoHR();

    String query = "SELECT first_name FROM employees WHERE employee_id = '" + ID + "'";

    Class.forName("com.mysql.cj.jdbc.Driver");

    Statement st;
    ResultSet rs;
    Connection con;

    try (con = DriverManager.getConnection(infoHR.get("url"), infoHR.get("uname"), infoHR.get("pass"))) {
        //Error on line above relating to not initialising the object within the statement

        st = con.createStatement();
        rs = st.executeQuery(query);

        rs.next();
        return rs.getString("first_name");

    } finally {

        st.close();
        con.close();
    }
}

提前为任何可以提供的帮助干杯:)

【问题讨论】:

    标签: java mysql jdbc


    【解决方案1】:

    我认为你的意思是使用:

        ResultSet rs;
        try (Connection con = DriverManager.getConnection(infoHR.get("url"), infoHR.get("uname"), infoHR.get("pass")); 
             Statement st = con.createStatement()) {
            //Error on line above relating to not initialising the object within the statement
    
            rs = st.executeQuery(query);
    
            rs.next();
            return rs.getString("first_name");
        }
    

    请记住,您正在使用自动关闭连接的 try-with-resources 块。你不需要在之前声明连接并在 finnaly 块中关闭它。

    【讨论】:

    • 为什么不需要结束语?
    • 刚刚编辑了我的答案以包含该部分
    • 对于结果集也可以这样说:它们应该被关闭。
    • 这是否意味着即使它不在语句中,它也会关闭 st?
    • try() 中的所有内容以及实现AutoCloseable 的内容都将自动关闭。其他所有内容仍需要在 finally 块中关闭或包含在 try() 语句中
    【解决方案2】:

    您需要像下面这样更改您的代码

     try (Connection con = DriverManager.getConnection(infoHR.get("url"), infoHR.get("uname"), infoHR.get("pass")),
                  Statement st = con.createStatement()) {
            //Error on line above relating to not initialising the object within the statement
    
            rs = st.executeQuery(query);
    
            rs.next();
            return rs.getString("first_name");
        }
    

    Java 7 – 允许我们声明要在 try 块中使用的资源,并确保在该块执行后资源将被关闭。

    你可以在这里找到更多 https://www.baeldung.com/java-try-with-resources

    【讨论】:

    • 为什么不需要结束语?
    • try-with-resources 自动为您关闭连接。这就是try-with-resources的主要功能,自动关闭所有声明的资源。
    • 为什么不将 try-with-resources 也应用于语句和结果集?
    • 你也可以申请那个。编辑了我的答案以反映相同
    猜你喜欢
    • 2020-01-15
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多