0

我找到了一段 Base64 编码的代码。在阅读它时,我偶然发现了这样的事情:

    try {
      // GZip -> Base64 -> ByteArray
      baos = new java.io.ByteArrayOutputStream();
      b64os = new OutputStream( baos, ENCODE | options );
      gzos  = new java.util.zip.GZIPOutputStream( b64os );

      gzos.write( source, off, len );
      gzos.close();


    }   // end try
    catch( java.io.IOException e ) {
      // Catch it and then throw it immediately so that
      // the finally{} block is called for cleanup.
      throw e;
    }   // end catch
    finally {
      try{ gzos.close();  } catch( Exception e ){}
      try{ b64os.close(); } catch( Exception e ){}
      try{ baos.close();  } catch( Exception e ){}
    }   // end finally

如您所见,IOException 在 catch 块中被捕获并立即重新抛出,这似乎不是一个错误,因为注释甚至描述了操作并将 finally 块的执行命名为目的。

但是无论如何都不会调用 finally 块吗?

资料来源:

Base64-De/Encoder(公共领域)(作者:Robert Harder)

4

1 回答 1

0

在某些情况下,您可能想要捕获并重新抛出异常。记录,清理只有生成异常的代码才知道的本地资源,可能是其中的一些原因。

异常将继续通过层冒泡,直到它到达捕获它并且不重新抛出它的其他代码,否则它将到达异常堆栈的顶部并且程序可以通过报告异常退出。

在上面的代码中,由于您不想在您的层处理异常,因此在gzos, baos, b64os将异常再次抛出到更高层之前需要释放一些资源。一旦你catch and re-throw,你finally block可以执行和清理持有的资源。

有时您可能还想用更多信息来结束异常。例如:

public void function() throws BaseException {
    try {
      ....
    } catch (IOException e) {
         throw new BaseChildException(e) // BaseChildException is a subclass of BaseException
    }
}
于 2014-06-13T12:25:44.377 回答