根据Oracle文档
try with resources语句是声明一个或多个资源的try语句。资源是一个对象,在程序完成后必须关闭它。try with resources语句确保在语句末尾关闭每个资源。任何实现java的对象。AutoCloseable,其中包括实现java的所有对象。伊奥。可关闭,可用作资源
如果资源未实现AutoCloseable,则无法在try块中声明,必须在主体部分中声明
不考虑实际不起作用的代码(如您的示例中的close()
方法不实际关闭资源)或完全外部的因素,例如人们将调试器附加到侧步清理,我可以想到三种情况,在这种情况下,try-with-resources可能无法清理资源:
线程生成的异常。stop()
。如果在清理代码中以这种方式“停止”线程,那么清理代码将被中止。这种异步异常的不安全性就是为什么线程。stop()
已被弃用,并替换为线程。中断()
,这是安全的
系统。调用exit()
。这可能被视为上述任何一种情况,但它可能在“正常情况下”发生
在所有其他方面,您应该能够放心,将调用close()
。Try with multiple resources与嵌套的Try块相同,因此引发异常的清理代码不会阻止其他清理例程。
是的。
try (FileSystem fs = FileSystems.getDefault()) {
return fs.getPath(aStringVar);
}
如果FileSystems.getDefault()
返回一个sun.nio.fs.UnixFileSystem
,就像它在具有Java8 SE的RedHat机器上对我所做的那样,它将在关闭时抛出一个不支持的操作异常
。尽管IntelliJ显示警告并告诉您将其包装为资源尝试,但您不应该这样做,除非您想处理这个愚蠢的异常。
不管错误情况如何,使用资源尝试是否总是关闭资源?我的意思是考虑以下代码: 会一直关闭吗?我读过Oracle文档,其中说: 无论try语句是正常完成还是突然完成,它都将关闭 因此无论程序正常运行还是抛出异常,它都将起作用。但是,类似或崩溃的情况怎么办?我知道这些条件对块不起作用。那么,使用资源尝试失败的条件是否存在? 这只是我请求的好奇心,谁能说明这一点吗?
我知道,如果资源已实现自动关闭,您通过尝试传递的资源将自动关闭。到现在为止,一直都还不错。但是,当我有几个我想要自动关闭的资源时,我该怎么办呢。带插座的示例; 所以我知道套接字将被正确关闭,因为它在try中作为参数传递,但是输入和输出应该如何正确关闭呢?
我正在为面向对象编程的秋季考试做准备,其中一种任务是提供代码输出,这通常包括一些异常处理问题。 现在我的问题是什么时候用资源尝试关闭它的资源,因为我的输出严格依赖于实现AutoCloseable的类的输出。 在提供的代码中,我不明白为什么“close 1”输出在“close 40”之前,或者为什么对象A(40)在这个块的末尾被关闭。是因为A(50)和A(40)是同一类型的吗? 我的主要问题是,Au
问题内容: 我正在编写一个连接到网站并从中读取一行的应用程序。我这样做是这样的: 好吗?我的意思是,我在最后一行关闭了BufferedReader,但没有关闭InputStreamReader。我是否应该从connection.getInputStream创建一个独立的InputStreamReader,并从独立的InputStreamReader创建一个BufferedReader,而不是关闭所
我需要打开N个多播套接字(其中N来自参数列表的大小)。然后,我将向循环中的N个套接字中的每个套接字发送相同的数据,最后关闭每个套接字。我的问题是,如何使用try with resources块来实现这一点?以下是我将如何使用单个资源来实现这一点: 我能想到的使用多个端口执行此操作的唯一方法如下: 有没有一种更简洁的方法来实现这一点,或者我提出的解决方案是否尽可能好?
由于Java9,我们可以有效地使用最终变量与资源。 下面的示例显示了一种情况,其中一个资源初始化引发异常。 当我运行这个示例时,我得到的唯一输出是RuntimeException,这意味着Resource1没有关闭。这是意料之中的,因为它没有在try with resources中初始化。 但是,这是预期的结果,还是我遗漏了什么? 因为,如果这实际上是它应该工作的方式,那么在我看来,这种新语法实际