【发布时间】:2016-04-18 18:50:15
【问题描述】:
当谈到文件处理和资源泄漏时,
这两种处理问题的方式有什么优缺点:
尝试使用资源 VS Try/catch/finally 使用 file.close?
谢谢
- 丸
【问题讨论】:
标签: java exception-handling file-processing try-with-resources resource-leak
当谈到文件处理和资源泄漏时,
这两种处理问题的方式有什么优缺点:
尝试使用资源 VS Try/catch/finally 使用 file.close?
谢谢
【问题讨论】:
标签: java exception-handling file-processing try-with-resources resource-leak
最大的区别是使用 try-finally 方法屏蔽异常的危险。如果您在关闭时不小心捕捉到 finally 块中抛出的任何内容,则可以屏蔽 try 块中抛出的任何异常。这意味着如果 try 块中的代码抛出异常,那么 finally 中的代码会抛出异常,传播的异常是 finally 块中的异常(通常不是您希望看到的异常)。
try-with-resources 消除了异常屏蔽的危险,它确保如果从 try 块中抛出异常,则 close 方法抛出的任何异常都会被添加为抑制异常。
try-with-resources 处理 try 块中没有抛出异常但关闭时抛出异常的情况与使用 try-finally 并捕获 finally 块中抛出的任何内容时的处理方式不同。使用 try-with-resources 将抛出关闭时抛出的异常(因为没有将其作为抑制异常添加到的异常),其中 try-finally 的常用方法是吃掉或记录从 finally 方法抛出的任何异常.因此,如果您不希望关闭失败导致引发异常,从而破坏一些原本可以正常工作的逻辑,您可能希望避免为此使用 try-with-resources。
一个显着的区别是 try-with-resources 如何允许多个资源。编写 try-finally 块的人通常对嵌套 try 块感到不耐烦,并使用快捷方式导致错误,例如在 finally 块中放置太多 close 语句(因此,如果一个语句失败,其余语句将不会执行,从而导致资源泄漏)。 try-with-resources 保证在退出时以正确的顺序关闭资源,因此不需要嵌套块。
【讨论】:
我的理解是这样的
try(InputStream is = new InputStream(...)){
...
}
在功能上等同于:
InputStream is=null;
try{
is = new InputStream(...);
...
}finally{
try{
is.close();
}catch(Exception e){}
}
【讨论】:
close() 抛出的异常不会被忽略。 try-with-resources 的翻译指定为here。