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

用资源尝试是否有可能关闭资源失败?

张建华
2023-03-14

根据Oracle文档

try with resources语句是声明一个或多个资源的try语句。资源是一个对象,在程序完成后必须关闭它。try with resources语句确保在语句末尾关闭每个资源。任何实现java的对象。AutoCloseable,其中包括实现java的所有对象。伊奥。可关闭,可用作资源

如果资源未实现AutoCloseable,则无法在try块中声明,必须在主体部分中声明

共有2个答案

微生德运
2023-03-14

不考虑实际不起作用的代码(如您的示例中的close()方法不实际关闭资源)或完全外部的因素,例如人们将调试器附加到侧步清理,我可以想到三种情况,在这种情况下,try-with-resources可能无法清理资源:

  • 电源故障、硬件故障、操作系统崩溃或虚拟机崩溃。对于这类事情,没有什么软件可以做,所以它们不在资源处理的范围之内。然而,您仍然需要记住这一点,以防您正在考虑使用try-with-resources语句来管理诸如强制锁定文件之类的事情
  • 异步异常,例如线程生成的异常。stop()。如果在清理代码中以这种方式“停止”线程,那么清理代码将被中止。这种异步异常的不安全性就是为什么线程。stop()已被弃用,并替换为线程。中断(),这是安全的
  • 如果系统。调用exit()。这可能被视为上述任何一种情况,但它可能在“正常情况下”发生

在所有其他方面,您应该能够放心,将调用close()。Try with multiple resources与嵌套的Try块相同,因此引发异常的清理代码不会阻止其他清理例程。

凤棋
2023-03-14

是的。

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中初始化。 但是,这是预期的结果,还是我遗漏了什么? 因为,如果这实际上是它应该工作的方式,那么在我看来,这种新语法实际