将try catch最终阻塞在另一个finally块中
try{ }catch(){} finally{ try{ }catch(){ } fianlly{ } }
拥有上面的代码是好的吗?
是的,你可以这样做。
实际上,在处理要正确关闭的流时,甚至需要执行此操作:
InputStream in = /* ... */; try { } catch (...) { } finally { try { in.close(); } catch (...) { } finally { } }
我认为这不是一个不好的做法
为了便于阅读,您可以将嵌套的try-catch分解为单独的方法,例如:
try{ }catch(){} finally{ cleanup(); }
第二个try-catch可以在清理方法中。
为了支持IO包中的上述模式,JAVA6引入了一个名为Closeable的新类,所有流都实现了,因此您可以使用单个清理方法,如下所示:
public static boolean cleanup(Closeable stream) { try{ stream.close(); return true; }catch(){ return false; } }
看起来很丑,但有时它是要走的路。 根据代码考虑使用第二个try-catch-finally块提取方法。
最好尽可能避免它,但有时可能是必要的。 如果你告诉我们你认为你需要这个的原因,我们可以给出更好的答案:-)
考虑的一个原因可能是在finally
块中提交事务,当提交操作本身可能抛出exception时。
值得注意的是,除非正确处理,否则在finally块内抛出的exception可能很容易影响try
块中之前抛出的exception。 因此,这种嵌套的try / catch块有时是可行的方法。 但是,正如其他人所指出的那样,为了提高可读性,建议将finally
块的内部提取到单独的方法中。
这很丑陋,但有些情况下你无法避免它,特别是在你拥有依赖资源的资源清理中,清理一个资源会引发exception。
一个典型的例子是在JDBC代码中整理ResultSet
, Statement
和Connection
对象。 关闭ResultSet
会抛出exception,但我们仍然希望继续并关闭Statement
和Connection