Java 将try-catch-finally块放入另一个finally块中
像上面这样的代码好吗?看起来很难看,但有时这是一种方法。根据代码考虑,用第二次尝试抓取最后一个块的方法。 最好避免,但有时可能是必要的。如果您能告诉我们更多您认为您需要此服务的原因,我们可能会给出更好的答案:-) 考虑的一个原因可能是在Java 将try-catch-finally块放入另一个finally块中,java,try-catch,Java,Try Catch,像上面这样的代码好吗?看起来很难看,但有时这是一种方法。根据代码考虑,用第二次尝试抓取最后一个块的方法。 最好避免,但有时可能是必要的。如果您能告诉我们更多您认为您需要此服务的原因,我们可能会给出更好的答案:-) 考虑的一个原因可能是在finally块中提交事务,此时提交操作本身可能会引发异常 重要的是要注意,在finally块中抛出的异常可能很容易掩盖先前在try块中抛出的异常,除非正确处理。因此,这种嵌套的try/catch块有时是可行的。但是,正如其他人所指出的,为了提高可读性,建议将fi
finally
块中提交事务,此时提交操作本身可能会引发异常
重要的是要注意,在finally块中抛出的异常可能很容易掩盖先前在try
块中抛出的异常,除非正确处理。因此,这种嵌套的try/catch块有时是可行的。但是,正如其他人所指出的,为了提高可读性,建议将finally
块的内部提取到一个单独的方法中。是的,您可以这样做
实际上,在处理要正确关闭的流时,您甚至需要这样做:
try {
} catch() {}
finally {
try {
} catch() { }
finally { }
}
我看不出任何情况下这是一种不好的做法为了可读性,您可以将嵌套的try-catch分解到单独的方法中,如:
InputStream in = /* ... */;
try {
} catch (...) {
} finally {
try {
in.close();
} catch (...) {
} finally {
}
}
第二个try-catch可以在cleanup方法中
为了在IO包中支持上述模式,JAVA6引入了一个名为Closeable的新类,所有流都实现该类,因此您可以使用一个清理方法,如下所示:
try{
}catch(){}
finally{
cleanup();
}
这很难看,但在某些情况下,您无法避免它,特别是在资源清理中,您有依赖的资源,清理一个资源可能会引发异常
一个典型的例子是整理JDBC代码中的
ResultSet
、Statement
和Connection
对象。关闭ResultSet
可能会引发异常,但我们仍然希望继续并关闭语句
,连接
,请阅读以下内容:好的示例。但我一直认为这是难以读取的代码,并尝试创建一些UTL方法或类,它可以用空校验来关闭可关闭的实例。
public static boolean cleanup(Closeable stream)
{
try{
stream.close();
return true;
}catch(){
return false;
}
}