最后和catch之后写的区别

时间:2013-06-23 14:39:52

标签: java exception try-catch try-catch-finally

“finally”和“catch”之后的写​​法有什么区别?

例如:

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

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

10 个答案:

答案 0 :(得分: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 
}

你怎么改写这个?没有代码重复,不可能。

答案 1 :(得分:3)

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

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

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

现在,无论try中发生什么,此代码都将返回false。在许多方面,这种行为与最终意味着什么的口语理解完全一致 - “无论事先在try块中发生什么,总是运行此代码。”因此,如果从finally块返回true,则整体效果必须始终为true,不是吗?

  

一般来说,这很少是一个好习惯,你最后应该使用   大量禁止清理/关闭资源,但很少,如果有的话   从它们返回一个值。

答案 2 :(得分:2)

您的情况没有区别。但

运行时系统始终执行finally block内的语句,而不管try块中发生了什么。

  

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

请注意,如果您使用的是JDK 7+,那么只需使用try-with-resources statement即可消除finally块的大部分用途。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

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

这些代码我们放入try {...} block& catch {...}块包含用于捕获try {}块中代码生成的异常的代码。

最后{...}块包含try {} catch {}块后立即执行的代码,当try {} block抛出异常时。

例如,当你访问某个网站时,但是对某些服务器端问题却无法和页面显示某种消息,如“404错误或服务器正在更新”,这些代码写在finally块中。

答案 5 :(得分:0)

这个简单的catch只用于catch eXception并处理它,但最后,如果是Exception则执行,例如对于紧密连接。

答案 6 :(得分:0)

最后一个块对于清理代码很有用,比如关闭开放流。

E.g:

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

答案 7 :(得分:0)

由于您的代码只返回true/false,因此它不会受到太大影响。但请考虑编写一些强制/清理代码来执行的任何其他代码/逻辑。

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

另外,为了使代码具有一致性,应始终使用finally块来执行任何清理代码。

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

答案 8 :(得分:0)

第一种情况:

如果在try块中发生异常,那么将执行catch块,并且如果再次发生异常则提供相同的catch块,则finally块将执行。

第二种情况:

如果try块中发生异常,则执行catch块,如果同一catch块中还有异常,则返回true;会执行。

答案 9 :(得分:-2)

只要我们想要执行某些代码行,即使发生异常,也会使用

finally() 但是如果你在catch之后编写代码行,如果发生异常就不会执行..