10

"finally" 和 write after "catch" 和有什么不一样?

例如:

public boolean example() {
    try {
        // Code
    } catch (RuntimeException e) {
        // Code
    } finally {
        return true;
    }
}

public boolean example() {
    try {
        // Code
    } catch (RuntimeException e) {
        // Code
    } 
    return true;
}
4

10 回答 10

7

首先,甚至可以被视为候选人的唯一成语是:

try {
    // stuff
} catch (Throwable t) { 
    // handle
}
// finally stuff

注意被捕获的类型。只有当你捕捉到任何可能的异常,包括像这样的黑暗怪物,ThreadDeathVirtualMachineError才能希望无条件地到达 try-catch 下面的代码。

但是,这只是开始的地方。如果处理代码本身抛出异常怎么办?所以你至少需要

try { 
    // main stuff
} catch (Throwable t) {
    try { 
        // handle 
    } catch (Throwable t) { 
        // no code allowed here! Otherwise we descend into
        // infinite recursion
    }
}
// finally stuff

现在您可能开始意识到 的好处finally,但这还不是全部。考虑一个非常典型的场景:

try { 
  // main stuff, may throw an exception. I want the exception to
  // break what I'm doing here and propagate to the caller.
  return true;
} finally { 
    // clean up, even if about to propagate the exception 
}

你如何重写这个?没有代码重复,是不可能的。

于 2013-06-23T15:28:52.860 回答
3

在您提供的代码中没有区别。但是 finally 用于在 try 块之后运行一段代码,无论是否有异常。

有趣的一点是,我们应该避免从 finally 块返回,因为当我们从 try 块返回一些东西时,它也会在场景中造成混乱。考虑这段代码:

try {
    return true;
}
finally {
    return false;
}

现在无论在 try 中发生什么,这段代码都会返回 false。在许多方面,这种行为与对 finally 含义的通俗理解完全一致——“无论在 try 块中事先发生了什么,总是运行这段代码。” 因此,如果您从 finally 块返回 true,则整体效果必须始终返回 true,不是吗?

一般来说,这很少是一个好的习惯用法,您应该自由地使用 finally 块来清理/关闭资源,但很少从它们返回值。

于 2013-06-23T14:42:45.283 回答
2

你的情况没有区别。但

运行时系统总是执行finally 块中的语句,而不管 try 块中发生什么。

所以它是进行清理的理想场所。

请注意,如果您使用的是 JDK 7+,则可以消除 finally 块的大多数使用,只需使用try-with-resources 语句即可。

于 2013-06-23T14:42:34.060 回答
1

我们在程序中使用 try 块、catch 块和 finally 块来处理异常。一个程序可能有检查或未经检查的异常。所以这个块用于处理那些异常。在 try 块中,我们提到或编写那些可能导致异常的代码,如果我们希望在发生异常时运行我们的代码,那么我们将这些代码写入 catch 块中。finally 是一个非常特殊的块,它为我们提供了一个特殊功能,如果我们的 catch 块没有运行,那么在程序终止之前,finally 块代码肯定会执行。这主要用于在不需要的程序终止期间保存我们的数据。如果我们使用 try 块,那么 try 块之后必须有一个 catch 块,但 finally 是可选的,不是强制性的。

于 2016-12-12T04:16:30.097 回答
0

由于您的代码仅返回true/false,因此不会产生太大影响。但是想想任何其他代码/逻辑,其中一些强制/清理代码被写入执行。

此外,很难通过我们的代码捕获所有异常,换句话说,我们应该捕获我们可以处理的特定异常。到那时,finally将是真正的救星,因为它将始终执行(除了System.exit()某些递归情况或在某些递归情况下)。

此外,为了使我们的代码保持一致性,应该始终使用finally块来执行任何清理代码。

您也可以参考以下帖子以获得更多说明:

于 2016-12-13T06:55:21.707 回答
0

第一种情况:

如果 try 块中发生异常,则执行 catch 块,如果再次发生异常,则执行相同的 catch 块,然后执行 finally 块。

第二种情况:

如果 try 块中发生异常,则执行 catch 块,如果同一 catch 块中还有进一步的异常,则“return true;” 会执行。

于 2016-12-13T12:02:17.543 回答
0

在这个问题中首先要理解的是“为什么我们使用 try{ } catch{ } 块” 好的。

答案是,当我们的代码有可能抛出异常时。

我们放在 try{... } 块和 catch {...} 块中的这类代码包含捕获由 try{ } 块中的代码生成的异常的代码。

finally{...} 块包含当 try{} 块抛出异常时在 try{} catch{} 块之后立即执行的代码。

例如,当您访问某个网站,但对某些服务器端问题执行不了时,页面显示诸如“404 错误或服务器正在更新”之类的消息,这些代码都写在 finally 块中。

于 2016-12-11T17:25:23.843 回答
0

finally 块对于清理你的代码很有用,比如关闭打开的流。

例如:

    File f = new File("\file.txt");
    FileStream fs;
    try{
       fs = new FileStream(f);
    } catch (IOException ioe){
       ioe.printStackTrace();
    } finally {
      if (fs != null) {
         fs.close() // close the stream
      }
    }
于 2016-12-12T19:30:21.207 回答
0

这个简单的 catch 仅用于 catch eXception 并对其进行处理,但最后,执行 if Exception or not ,例如用于关闭连接。

于 2016-12-12T01:53:48.617 回答
-2

当我们希望即使发生异常也应该执行某行代码时使用 finally() 但是如果您在 catch 之后编写代码行,如果发生异常则不会执行..

于 2013-06-23T14:45:54.030 回答