当前位置: 首页 > 面试题库 >

尝试使用资源的详细信息

邓业
2023-03-14
问题内容

使用对象,我们使用3个基本步骤:

  1. 宣言
  2. 实例化
  3. 初始化

我的问题是(),为了自动关闭将要使用的资源,必须在试用过程中执行哪些步骤。

示例1-将在以下代码中自动关闭FileReader对象:

try (BufferedReader br = new BufferedReader(new FileReader(filePath)))
{
//some code;
}

示例2-将使用以下代码自动关闭buf2:

private static BufferedReader buf1;

public static void main(String[] args) throws IOException {
    //some code
    try (BufferedReader buf2 = buf1)
    {

    } 
 }

PS有人认为这个问题是Try With Resources vs Try-Catch的重复。它不是。这个问题是关于try-catch和try-with-resources之间的区别。我的问题是有关试用的详细信息。


问题答案:

每当需要与语言相关的细节时,最完整的参考就是Java语言规范(仅适用于Google)。对于try-with-
resources语句,您可以阅读14.20.3节,其中指出以下内容:

try ({VariableModifier} R Identifier = Expression ...)
    Block

被翻译成

{
   final {VariableModifierNoFinal} R Identifier = Expression; 
   Throwable #primaryExc = null;
   try ResourceSpecification_tail
      Block catch (Throwable #t) {
         #primaryExc = #t;
         throw #t;
      } finally {
         if (Identifier != null) {
            if (#primaryExc != null) { 
               try { 
                  Identifier.close(); 
               } catch (Throwable #suppressedExc) { 
                  #primaryExc.addSuppressed(#suppressedExc);
               }
            } else {
               Identifier.close();
            }
         }
     }
}

在第一个示例中,资源RBufferedReaderIdentifieris brExpressionis为new BufferedReader(newFileReader(filePath))。因此,仅BufferedReader在隐式finally块中关闭了。该finally块不会调用closeFileReader因为它
不是 资源声明本身的一部分。 但是
,碰巧BufferedReader.close()内部实现会调用close包装的方法FileReader。因此,第一个问题的答案是肯定的,因为包装对象将其关闭(遵循通常的观点,即资源在被释放时应该释放任何包装的资源),
而不是 因为try-with-resources。

在第二个示例中:

private static BufferedReader buf1;

public static void main(String[] args) throws IOException {
    //some code
    try (BufferedReader buf2 = buf1)
    {

    } 
}

答案取决于somecode。在这里buf2buf1两者都指向html" target="_blank">内存中的同一对象。如果此“某些代码”初始化buf1为某个对象,则该对象将被关闭,因为buf2它也引用了它。如果不是,并且buf1为null(因此buf2为null),则不会关闭任何内容,因为finally上面显示的隐式中存在null检查。



 类似资料:
  • 在当前版本中,您不仅可以查看AssetBundle文件的包含资源信息和依赖关系信息,同时还可以查看每种资源的详细使用信息。目前,UWA资源检测服务对于主流资源的支持如下: 纹理资源 对于纹理资源,UWA可以提供以下重要信息:分辨率、资源格式、内存占用、Mipmap功能是否开启 和 Read/Write是否开启。这些均为影响纹理文件尺寸和内存占用的重要因素。因此,我们将其在此进行详细展示,您可以对每

  • 问题内容: 我一直在看代码,并且看到了尝试资源的机会。我以前使用过标准的try-catch语句,看起来它们在做同样的事情。所以我的问题是“ 尝试使用资源”与“尝试捕获 ”之间的区别是什么,哪个更好。 这是尝试使用资源: 问题答案: 尝试使用资源的重点是确保可靠地关闭资源。 当你不使用try-with-resources时,存在一个潜在的陷阱,称为异常屏蔽。当try块中的代码引发异常,而finall

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

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

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

  • 不管错误情况如何,使用资源尝试是否总是关闭资源?我的意思是考虑以下代码: 会一直关闭吗?我读过Oracle文档,其中说: 无论try语句是正常完成还是突然完成,它都将关闭 因此无论程序正常运行还是抛出异常,它都将起作用。但是,类似或崩溃的情况怎么办?我知道这些条件对块不起作用。那么,使用资源尝试失败的条件是否存在? 这只是我请求的好奇心,谁能说明这一点吗?