为什么在许多代码中写如:
finally{
if(out!=null){
try{out.close();}
catch(){}
}}
但不是:
finally{
try{out.close();}
catch(){}
}
答案 0 :(得分:0)
通常您想要创建某种流。此创建可能会失败,例如因为文件丢失或互联网连接不起作用。因此,您需要将其放入try-catch-block中,因为它会抛出您需要处理的检查异常:
Stream stream = null;
try {
stream = makeNewStream();
// more stuff
} catch(SomeException e) {
// do something with the exception
}
现在你想确定,无论发生什么,流最终都会关闭。所以你添加一个finally块:
Stream stream = null;
try {
stream = makeNewStream();
// more stuff
} catch(SomeException e) {
} finally {
stream.close()
}
即使您的代码失败(例如stream = makeNewStream();
抛出异常),也会在任何情况下调用此块。但是如果stream = makeNewStream();
抛出异常,变量stream
将为null。所以你需要检查stream是否为null(你不能在null上调用方法;):
finally {
if(stream != null)
stream.close()
}
现在,不幸的是,close()
也会抛出一个检查异常(需要处理),所以你也必须检查一下。你最终会得到这样的东西:
Stream stream = null;
try {
stream = makeNewStream();
// more stuff
} catch(SomeException e) {
} finally {
if(stream != null) {
try {
stream.close()
} catch(ClosingException e) {
// ignore this
}
}
}
大多数开发人员只会忽略finally块中的最后一个异常。