考虑以下情况:
try (ResultSet resultSet = DriverManager.getConnection("jdbc:...", "user", "pass")
.createStatement().executeQuery(sql)) {
.
.
.
}
在这种情况下,在try资源中创建了三个资源:连接、语句和结果集。
try块结束后,这三种资源会发生什么变化?即使它们没有任何引用,它们都会被关闭吗?还是只会关闭结果集?
在尝试使用资源块时声明AutoCloseable
资源而不引用它们是否安全?
您也可以使用多种资源来实现这一点:
try (Connection c = DriverManager.getConnection("jdbc:...", "user", "pass");
Statement s = c.createStatement();
ResultSet resultSet = s.executeQuery(sql)) {
//...
}
所有实现自动关闭接口的变量在执行try块后关闭。
在try-with-resource块中声明自动关闭的资源而不引用它们安全吗?
是和否。未分配给资源变量的资源不会被此代码自动关闭。因此:
因为我把“安全”解释为这两件事,所以我深思熟虑的回答是“不”,这不安全。
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很可能触发完全垃圾回收,垃圾回收将查找并关闭丢弃的资源…)
只有结果集才会关闭。如果希望关闭多个资源,则需要分别声明它们:
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图像的路径替换为整数。但不要让这些细节分散你的