当前位置: 首页 > 知识库问答 >
问题:

对在没有任何参考的情况下创建的资源使用“尝试使用资源”

查学文
2023-03-14

考虑以下情况:

try (ResultSet resultSet = DriverManager.getConnection("jdbc:...", "user", "pass")
                                      .createStatement().executeQuery(sql)) {    
                    .
                    .
                    .
}

在这种情况下,在try资源中创建了三个资源:连接、语句和结果集。

try块结束后,这三种资源会发生什么变化?即使它们没有任何引用,它们都会被关闭吗?还是只会关闭结果集?

在尝试使用资源块时声明AutoCloseable资源而不引用它们是否安全?

共有3个答案

赵浩邈
2023-03-14

您也可以使用多种资源来实现这一点:

try (Connection c = DriverManager.getConnection("jdbc:...", "user", "pass");
     Statement s = c.createStatement();
     ResultSet resultSet = s.executeQuery(sql)) {
   //...
}

所有实现自动关闭接口的变量在执行try块后关闭。

百里飞捷
2023-03-14

在try-with-resource块中声明自动关闭的资源而不引用它们安全吗?

是和否。未分配给资源变量的资源不会被此代码自动关闭。因此:

  • “是”这些资源仍然可以通过对try块中的ResultSet进行操作来“安全”使用

因为我把“安全”解释为这两件事,所以我深思熟虑的回答是“不”,这不安全。

try with resources将自动关闭的唯一资源是分配给资源变量的资源。所以正确的写作方法是:

try (Connection connection = DriverManager.getConnection(...);
     Statement statement = connection.createStatement();
     ResultSet resultSet = statement.executeQuery(sql)) {
    // ...   
}

请注意,资源变量按声明的相反顺序自动关闭。

注意,你经常可以逃脱惩罚。例如:

try (BufferedWriter bw = new BufferedWriter(new FileWriter(...)) {
    // ...   
}

除非在极不寻常的情况下,否则可能没有问题。当bw自动关闭时,其方法调用FileWriter上的。这可能泄漏资源的唯一情况是当BufferedWriter创建/构造失败时。我认为只有在你运气不好的时候才有可能在那一点上得到一个OOME。(OOME很可能触发完全垃圾回收,垃圾回收将查找并关闭丢弃的资源…)

梁丘伟
2023-03-14

只有结果集才会关闭。如果希望关闭多个资源,则需要分别声明它们:

try (Connection conn  = DriverManager.getConnection("jdbc:...", "user", "pass");
     Statement stmt = conn.createStatement();
     ResultSet resultSet = stmt.executeQuery(sql)) {    

     // do stuff...
}
 类似资料:
  • 我想使用try with resource来切换上下文,但try()似乎无法在不声明变量的情况下使用资源,这使得代码不那么优雅。例如 和用法: 但是我在try()上得到了Syntext错误。只有当我这样写的时候:它通过编译。最优雅的方法是什么? 最新消息 因为在一些答案中,人们不明白我想做什么,所以我会尝试更好地解释。我试图以一种更优雅的方式实现以下逻辑:

  • 【资源使用】页面展示具体的资源使用信息,主要包括以下几个方面: 总资源查看 “总资源数”表示该次资源检测过程中,UWA所检测到的资源文件总量。点击“总资源数”,即可查看具体的资源名称、资源类型和所属的AssetBundle文件。目前,我们列出了项目的主要资源类型,您可以通过选择不同的类型来查看相应的资源文件。 上图表格中的每一行,我们均展示了资源与AssetBundle的具体从属关系。同时,您可以

  • 问题内容: 我试图将配置(例如URLs / etc)放入资源文件夹中,以供实用程序类使用。但是,我不想从任何地方的活动中传递上下文。我希望能够通过路径名(似乎使用assess /是为此用途设计的)来访问资源,而无需使用上下文来访问资源。 在这种特殊情况下,我希望单例实例化时在配置中使用某些东西。除了实例化期间的那一次之外,它不需要任何资源。因此,每次调用getInstance()时都必须传递Con

  • 我知道,如果资源已实现自动关闭,您通过尝试传递的资源将自动关闭。到现在为止,一直都还不错。但是,当我有几个我想要自动关闭的资源时,我该怎么办呢。带插座的示例; 所以我知道套接字将被正确关闭,因为它在try中作为参数传递,但是输入和输出应该如何正确关闭呢?

  • 我需要打开N个多播套接字(其中N来自参数列表的大小)。然后,我将向循环中的N个套接字中的每个套接字发送相同的数据,最后关闭每个套接字。我的问题是,如何使用try with resources块来实现这一点?以下是我将如何使用单个资源来实现这一点: 我能想到的使用多个端口执行此操作的唯一方法如下: 有没有一种更简洁的方法来实现这一点,或者我提出的解决方案是否尽可能好?

  • 我认为流API在这里是为了使代码更易于阅读。我觉得有点烦。流接口扩展了java。lang.AutoCloseable接口。 因此,如果你想正确地关闭流,你必须使用try-with资源。 清单1.不是很好,流没有关闭。 清单2.使用2嵌套try 清单3。当map返回流时,必须关闭stream()和map()函数。 我举的例子毫无意义。为了示例,我将jpg图像的路径替换为整数。但不要让这些细节分散你的