【发布时间】:2011-08-31 00:58:14
【问题描述】:
try {
} catch() {}
finally {
try {
} catch() { }
finally { }
}
上面的代码好不好?
【问题讨论】:
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 的新类,所有流都实现了,这样您就可以有一个单一的清理方法,如下所示:
public static boolean cleanup(Closeable stream)
{
try{
stream.close();
return true;
}catch(){
return false;
}
}
【讨论】:
最好尽量避免,但有时可能是必要的。如果您告诉我们更多关于您认为需要此功能的原因,我们可能会给出更好的答案:-)
考虑的一个原因可能是在finally 块中提交事务,此时提交操作本身可能会引发异常。
请务必注意,除非处理得当,否则在 finally 块中抛出的异常可能很容易掩盖之前在 try 块中抛出的异常。因此,这种嵌套的 try/catch 块有时是可行的方法。但是,正如其他人所指出的,为了提高可读性,建议将 finally 块的内部提取到单独的方法中。
【讨论】:
看起来很丑,但有时这是要走的路。根据代码考虑使用第二个 try-catch-finally 块提取方法。
【讨论】:
这很丑陋,但在某些情况下您无法避免,尤其是在资源清理中,您有依赖资源并且清理一个资源可能会引发异常。
一个典型的例子是整理 JDBC 代码中的 ResultSet、Statement 和 Connection 对象。关闭ResultSet 可能会引发异常,但我们仍然希望继续并关闭Statement 和Connection
【讨论】: