涉及文件处理和资源泄漏时,
这两种处理问题的方法有哪些优点和缺点:
尝试使用资源VS Try / catch / finally with file.close?
由于
答案 0 :(得分:1)
最大的区别在于使用try-finally方法进行异常屏蔽的危险。如果您不小心捕获在finally块中抛出的任何内容,则可以屏蔽try块中抛出的任何异常。这意味着如果try块中的代码抛出异常,则finally中的代码抛出异常,传播的异常是finally块中的异常(通常不是您想要查看的那个)。
通过确保如果从try块抛出异常,try-with-resources消除了异常屏蔽的危险,close方法抛出的任何异常都被视为一个被抑制的异常。如果你使用try-finally并捕获finally块中抛出的任何内容,try-with-resources会以不同的方式处理try块中抛出异常但抛出异常的情况。使用try-with-resources会抛出close上抛出的异常(因为没有异常将其添加为抑制异常),其中try-finally的常用方法是吃掉或记录finally方法抛出的任何异常。因此,如果你不想在关闭时失败导致抛出异常,破坏一些正常工作的逻辑,你可能想避免尝试使用资源。
一个显着的区别是try-with-resources如何允许多个资源。编写try-finally块的人通常会对嵌套try块感到不耐烦并导致使用快捷方式的错误,例如在finally块中放置太多关闭语句(因此如果一个失败则其余的不执行,导致资源泄漏)。 try-with-resources保证在出路时以正确的顺序关闭资源,这样就不需要嵌套块。
答案 1 :(得分:-1)
我的理解是
try(InputStream is = new InputStream(...)){
...
}
在功能上等同于:
InputStream is=null;
try{
is = new InputStream(...);
...
}finally{
try{
is.close();
}catch(Exception e){}
}