我应该在try-with-resources语句中声明每个资源吗?

时间:2019-03-22 03:56:15

标签: java try-catch try-with-resources

在我搜索过的许多尝试资源示例中,Statement和ResultSet分别声明。正如Java文档所提到的,资源的close方法以其创建的相反顺序调用。

try (Statement stmt = con.createStatement();
      ResultSet rs = stmt.executeQuery(sql) ) {

} catch (Exception e) {

}

但是现在我的函数中有多个查询。

我可以只在一行中创建Statement和ResultSet吗?我的代码就像:

try (ResultSet rs = con.createStatement().executeQuery(sql);
     ResultSet rs2 = con.createStatement().executeQuery(sql2);
     ResultSet rs3 = con.createStatement().executeQuery(sql3)) {

} catch (Exception e) {

}

如果仅在一行中声明它们,它是否仍关闭ResultSet和Statement的资源?

2 个答案:

答案 0 :(得分:1)

仔细查看后,您会发现该概念称为try-with-resource s

注意复数!整个想法是,您可以在单个语句中声明一个或多个资源,并且jvm保证正确处理。

换句话说:当资源在语义上属于在一起时,最好将它们一起声明。

答案 1 :(得分:0)

是的,它与您在问题中所说的完全一样,由分号分隔的多个语句。

  

您可以在try-with-resources语句中声明一个或多个资源。下面的示例检索压缩文件zipFileName中打包的文件的名称,并创建一个包含这些文件名称的文本文件:

 try (
    java.util.zip.ZipFile zf =
         new java.util.zip.ZipFile(zipFileName);
    java.io.BufferedWriter writer = 
        java.nio.file.Files.newBufferedWriter(outputFilePath, charset)
) {
    // Enumerate each entry
    for (java.util.Enumeration entries =
                            zf.entries(); entries.hasMoreElements();) {
        // Get the entry name and write it to the output file
        String newLine = System.getProperty("line.separator");
        String zipEntryName =
             ((java.util.zip.ZipEntry)entries.nextElement()).getName() +
             newLine;
        writer.write(zipEntryName, 0, zipEntryName.length());
    }
}

https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

ResultSet实现了AutoCloseable,这意味着try-with-resources也会在使用完它后强制关闭它。

https://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html