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 异常声明