try {
} catch() {}
finally {
try {
} catch() { }
finally { }
}
像上面那样编写代码是否好?
是的,你可以这样做。
事实上,在处理需要正确关闭的流时,这甚至是必需的:
InputStream in = /* ... */;
try {
} catch (...) {
} finally {
try {
in.close();
} catch (...) {
} finally {
}
}
我没有看到任何情况下这会变成不良实践
为了提高可读性,您可以将嵌套的try-catch分解为一个单独的方法,例如:
try{
}catch(){}
finally{
cleanup();
}
第二个 try-catch 块可以放在 cleanup 方法内部。
为了支持 IO 包中的上述模式,JAVA6 引入了一个名为 Closeable 的新类,所有流都实现了它,以便您可以拥有如下单个 cleanup 方法:
public static boolean cleanup(Closeable stream)
{
try{
stream.close();
return true;
}catch(){
return false;
}
}
有些情况下,虽然不太美观,但你无法避免它。特别是在资源清理方面,当你有相关的资源,而清理其中一个资源会抛出异常时,就需要这么做。
JDBC代码中,典型的例子是整理 ResultSet
、Statement
和 Connection
对象。关闭 ResultSet
可能会抛出异常,但我们仍然希望继续关闭 Statement
和 Connection
。
看起来不太美观,但有时候这是必须的。根据代码情况,考虑使用第二个try-catch-finally块提取一个方法。