为什么在许多代码写“如果尝试捕获”?

时间:2014-05-19 11:11:41

标签: java syntax syntax-error

为什么在许多代码中写如:

finally{
if(out!=null){
try{out.close();}
catch(){}
}}

但不是:

finally{
try{out.close();}
catch(){}
}

1 个答案:

答案 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块中的最后一个异常。