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

Java 尝试使用资源vs尝试捕获

艾子石
2023-03-14
问题内容

我一直在看代码,并且看到了尝试资源的机会。我以前使用过标准的try-catch语句,看起来它们在做同样的事情。所以我的问题是“ 尝试使用资源”与“尝试捕获 ”之间的区别是什么,哪个更好。

这是尝试使用资源:

objects jar = new objects("brand");
objects can= new objects("brand");

try (FileOutputStream outStream = new FileOutputStream("people.bin")){
    ObjectOutputStream stream = new ObjectOutputStream(outStream);

    stream.writeObject(jar);
    stream.writeObject(can);

    stream.close();
} catch(FileNotFoundException e) {
    System.out.println("sorry it didn't work out");
} catch(IOException f) {
    System.out.println("sorry it didn't work out");
}

问题答案:

尝试使用资源的重点是确保可靠地关闭资源。

当你不使用try-with-resources时,存在一个潜在的陷阱,称为异常屏蔽。当try块中的代码引发异常,而finally中的close方法也引发异常时,try块引发的异常将丢失,而finally中引发的异常将被传播。这通常是不幸的,因为关闭时抛出的异常是无益的,而有用的异常是信息性的异常。(因此,没有看到告诉你违反了哪个参照完整性约束的SQLException,而是显示了类似BrokenPipeException的情况,其中关闭资源失败。)

这种异常掩盖是一个令人讨厌的问题,资源尝试可以防止这种情况发生。

作为确保异常屏蔽不会丢失重要的异常信息的一部分,当开发try-with-resources时,他们必须决定如何处理close方法抛出的异常。

使用try-with-resources时,如果try块引发异常,并且close方法也引发异常,则close块中的异常将附加到原始异常:

…在某些情况下,同级代码块中可能引发两个独立的异常,特别是在try-with-resources语句的try块和编译器生成的finally块中,这两个异常会关闭资源。在这些情况下,只能传播所引发的异常之一。在try-with-resources语句中,当有两个这样的异常时,将传播来自try块的异常,并将finally块的异常添加到由try块的异常抑制的异常列表中。作为异常展开堆栈,它可以累积多个抑制的异常。

另一方面,如果你的代码正常完成,但是你正在使用的资源在关闭时抛出异常,则抛出该异常(如果try块中的代码抛出任何内容,该异常将被抑制)。这意味着,如果你有一些JDBC代码,其中TrySet-with-resources关闭了ResultSet或PreparedStatement,则当JDBC对象关闭时,由于基础结构故障而导致的异常可能会抛出,并且可能回滚本来可以成功完成的操作。

没有try-with-resources,是否抛出close方法异常取决于应用程序代码。如果在try块引发异常时将其抛出到finally块中,则finally块中的异常将掩盖另一个异常。但是开发人员可以选择捕获关闭时抛出的异常,而不传播它。



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

  • 问题内容: 我是的新手,我想知道对于资源来说,我是否必须为每个添加一个,否则它将与上面的代码一起使用 问题答案: 通过在 块中声明所有资源,可以尝试将资源与多个资源一起使用,并且此功能是 Java 7中 引入的,而不是 Java 8中 引入的。如果有多个资源,则可以如下所示 在此示例中,该语句包含两个用分号分隔的声明: ZipFile 和 BufferedWriter 。当它紧随其后的代码块终止时

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

  • 我是新手,我想知道,对于资源,我是否必须为每个

  • 我目前正在进行一个项目,该项目使用HP的Fortify SCA工具来捕捉代码库中的安全问题。我在确定正确处理JDBC资源的最佳方法时遇到了一些问题。 我现在拥有的代码如下所示; 问题是Fortify会标记这段代码,说明如果嵌套的try语句中发生异常,那么对conn和ps的引用将丢失,它们将无法正确关闭。fortify标记这一点是正确的还是误报?据我所知,try with资源应该总是关闭它们的资源,

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