Try-with-resource'必须是变量声明'[重复]

Posted

技术标签:

【中文标题】Try-with-resource\'必须是变量声明\'[重复]【英文标题】: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();
    

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

【问题讨论】:

【参考方案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的主要功能,自动关闭所有声明的资源。 你可以在这里找到更多mkyong.com/java/try-with-resources-example-in-jdk-7 为什么不将 try-with-resources 也应用于语句和结果集? 你也可以申请那个。编辑了我的答案以反映相同

以上是关于Try-with-resource'必须是变量声明'[重复]的主要内容,如果未能解决你的问题,请参考以下文章

[Java开发之路](20)try-with-resource 异常声明

使用try-with-resource优雅关闭资源

java try-with-resource语句使用

Java进阶知识点3:更优雅地关闭资源 - try-with-resource语法

SQL 提示必须声明表变量

后续的变量声明必须具有相同的类型。变量“where”必须是“any[]”类型,但这里有“string[]”类型