尝试使用资源与Try-Catch

我一直在看代码,我看到尝试与资源。 我之前使用过标准的try-catch语句,看起来他们做的是一样的事情。 所以我的问题是尝试使用资源VS 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"); } 

试用资源的要点是确保资源closures,而不需要应用程序代码来完成。 尽pipe如此,还有一些要考虑的要点。

当你不使用try-with-resources时,有一个潜在的陷阱叫做exception掩蔽。 当try块中的代码抛出一个exception,并且finally中的close方法也抛出一个exception时,try块抛出的exception就会丢失,最后得到的exception将被传播。 这通常是不幸的,因为closures引发的exception是无益的,而有用的exception是信息性的exception。 使用试用资源closures资源将防止发生任何exception屏蔽。

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

用try-with-resources,如果try块引发一个exception,并且close方法也抛出一个exception,那么close块中的exception会被加到原来的exception上 :

…有些情况下,可能会在兄弟代码块中引发两个独立的exception,特别是try-with-resources语句的try块和编译器生成的closures资源的finally块。 在这些情况下,只有一个抛出的exception可以被传播。 在try-with-resources语句中,当有两个这样的exception时,源自try块的exception被传播,并且finally块中的exception被添加到由try块中的exception所抑制的exception列表中。 作为一个exception展开堆栈,它可以累积多个抑制exception。

另一方面,如果你的代码正常完成,但是你正在使用的资源在closures时抛出一个exception,那么这个exception(如果try块中的代码抛出任何东西,这个exception就会被抛出)被抛出。 因此,如果您有一些JDBC代码(其中ResultSet或PreparedStatement被try-with-resourcesclosures),则可以抛出JDBC对象closures时由于某些基础结构故障导致的exception,并且可能会回滚成功完成的操作。

如果不尝试使用资源,close方法exception是否被抛出取决于应用程序代码。 如果它在try块引发exception时被finally块抛出,finally块中的exception将掩盖另一个exception。 但是开发人员可以select捕捉closures引发的exception,而不是传播它。

你错过了什么, finally一块。 try-with-resouces将使它像这样,

 FileOutputStream outStream = null; try { 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"); } finally { if (outStream != null) { try { outStream.close(); } catch (Exception e) { } } } 

这意味着你真的想要像( 从来没有吞下例外),

 try (FileOutputStream outStream = new FileOutputStream("people.bin"); ObjectOutputStream stream = new ObjectOutputStream(outStream);) { stream.writeObject(jar); stream.writeObject(can); // stream.close(); // <-- closed by try-with-resources. } catch(FileNotFoundException e) { System.out.println("sorry it didn't work out"); e.printStackTrace(); } catch(IOException f) { System.out.println("sorry it didn't work out"); e.printStackTrace(); } 

唯一的区别是try-resource自动添加resource.close(); 就像你finally阻止