1

我今天遇到了一个小问题,我有一段这样的代码,这让我有点不舒服......

   try{
       //stuff...
   } finally {
       //finally stuff
   }

我想知道这样的实现是否是一个好的实践,当异常发生时try并被重新抛出给处理它的调用者。这相当于下面的代码吗?

    try{
        //code....
    } catch (Exception e) {
        //handling...
    } finally {
        //finishing up
    }
4

2 回答 2

5

由于您已经给出的原因,它不等效:在第一种情况下仍然抛出异常。并且可能有一些原因,您确实想要这样的行为:关闭资源,例如finally块中的流,但将异常抛出封闭方法,以便在其他地方处理它。

顺便说一句,您也可以“滥用” try-finally构造,以防根本没有例外:

private StringBuilder buffer = new StringBuilder();

private String getBuffer() {
    try {
            // return current String content of the buffer
            return buffer.toString();
    } finally {
            // assign a new StringBuilder, before method returns
            buffer = new StringBuilder();
    }
}
于 2013-05-15T18:23:51.300 回答
2

不完全是,try/finally没有的块catch相当于

try {
    // ...
} catch (Exception e) {
    throw;
} finally {
    // finishing up
}

你只是重新抛出异常而不处理它。catch如果您打算这样做,则省略该块很好,它可以提高代码的可读性。

于 2013-05-15T18:30:51.327 回答