Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将try-catch-finally块放入另一个finally块中_Java_Try Catch - Fatal编程技术网

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;
  }
}