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

使用资源尝试是否总是关闭资源

阚吕恭
2023-03-14

不管错误情况如何,使用资源尝试是否总是关闭资源?我的意思是考虑以下代码

try (BufferedReader br =
               new BufferedReader(new FileReader(path))) {
    return br.readLine();
}

br会一直关闭吗?我读过Oracle文档,其中说:

无论try语句是正常完成还是突然完成,它都将关闭

因此无论程序正常运行还是抛出异常,它都将起作用。但是,类似system.exitjvm崩溃的情况怎么办?我知道这些条件对finally块不起作用。那么,使用资源尝试失败的条件是否存在?

这只是我请求的好奇心,谁能说明这一点吗?

共有1个答案

水麒
2023-03-14

try-with-resource只是一种语法上的糖,可以省去对finally子句的麻烦。在try块内发生的任何“java-ish”都不会阻止资源关闭--返回、抛出异常等。

任何突然终止JVM的行为(如调用system#exit、终止JVM的进程、拔掉计算机插头等)都不会被处理,就像它不是由老式的finally子句处理一样。

 类似资料:
  • 根据Oracle文档 try with resources语句是声明一个或多个资源的try语句。资源是一个对象,在程序完成后必须关闭它。try with resources语句确保在语句末尾关闭每个资源。任何实现java的对象。AutoCloseable,其中包括实现java的所有对象。伊奥。可关闭,可用作资源 如果资源未实现AutoCloseable,则无法在try块中声明,必须在主体部分中声明

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

  • 我正在为面向对象编程的秋季考试做准备,其中一种任务是提供代码输出,这通常包括一些异常处理问题。 现在我的问题是什么时候用资源尝试关闭它的资源,因为我的输出严格依赖于实现AutoCloseable的类的输出。 在提供的代码中,我不明白为什么“close 1”输出在“close 40”之前,或者为什么对象A(40)在这个块的末尾被关闭。是因为A(50)和A(40)是同一类型的吗? 我的主要问题是,Au

  • 一本关于Java的初学者书中有以下代码。这本书也很好地解释了异常,并且由于我理解了异常是如何工作的,我得到了一个关于下面代码的问题。 由于某种原因,如果FileWriter类抛出异常,将不会被执行。因此,我认为关闭writer对象的最佳位置是在finally块中。甚至在此之前,我已经看到过许多这样编写的代码,其中资源将在try块本身中关闭。我认为这样做是没有意义的。只有在没有例外的情况下,资源才会

  • 由于Java9,我们可以有效地使用最终变量与资源。 下面的示例显示了一种情况,其中一个资源初始化引发异常。 当我运行这个示例时,我得到的唯一输出是RuntimeException,这意味着Resource1没有关闭。这是意料之中的,因为它没有在try with resources中初始化。 但是,这是预期的结果,还是我遗漏了什么? 因为,如果这实际上是它应该工作的方式,那么在我看来,这种新语法实际

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