问题描述
|
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;
}
}
,看起来很丑,但是有时候是要走的路。根据代码,考虑使用第二个try-catch-finally块提取方法。
,最好在可能的情况下避免使用它,但是有时可能有必要。如果您告诉我们更多您为什么认为自己需要这样做的信息,我们可能会给出更好的答案:-)
考虑的原因之一可能是在提交操作本身可能引发异常的情况下在“ 4”块中提交事务。
重要的是要注意,除非正确处理,否则在finally块内引发的异常可能会轻易地掩盖在try
块内较早引发的异常。因此,这种嵌套的try / catch块有时是可行的方法。但是,正如其他人指出的那样,为了提高可读性,建议将“ 4”块的内部提取到单独的方法中。
,这很丑陋,但是在某些情况下您无法避免,特别是在资源清理中,如果您拥有依赖的资源,并且清理一种资源可能会引发异常。
一个典型的示例是用JDBC代码整理ResultSet
,Statement
和Connection
对象。关闭ResultSet
可能会引发异常,但是我们仍然想继续关闭Statement
和Connection