没有 Catch 的最终块

我在看一些新的代码。该程序只有一个 try 和一个 finally 块。由于 catch 块被排除在外,如果 try 块遇到异常或任何可抛出的东西,它将如何工作?它是直接进入 finally 块吗?

151931 次浏览

如果 try 块中的任何代码可以抛出检查过的异常,那么它必须出现在方法签名的 throw 子句中。如果抛出一个未检查的异常,它将冒泡出该方法。

不管是否引发异常,finally 块始终执行。

你不用那个程序试试吗?它将转到 finally 块并执行 finally 块,但是不会处理异常。但是,这个异常可以在 finally 块中被否决!

如果 try 块是这样工作的,那么它是如何工作的呢 遇到异常或者其他什么的 可以扔

异常被抛出块外,就像在其他没有捕获异常的情况下一样。

不管 try 块是如何退出的,也不管是否存在任何 catch,也不管是否存在匹配 catch,都将执行 finally 块。

Catch 块和 finally 是 try 块的正交部分。你可以选择其中一个,或者两个都要。有了 Java7,你就可以两者都不拥有!

Finally 块总是在 try 块结束后运行,不管 try 是正常结束还是由于异常(呃,可抛出)而异常结束。

如果 try 块中的任何代码引发异常,则当前方法只是重新引发(或继续引发)同一异常(在运行 finally 块之后)。

如果 finally 块抛出一个异常/错误/抛出,并且已经有一个挂起的抛出,那么它将变得很丑陋。坦率地说,我忘记了到底发生了什么(这么多年前我的认证)。我把 好好想想两个可扔的东西联系在一起,但是有一些特殊的巫术你必须做(例如-一个方法调用我必须查找)得到原来的问题在“最后”呕吐,呃,呕吐之前。

顺便说一句,try/finally 是资源管理中非常常见的事情,因为 Java 没有析构函数。

例如 -

r = new LeakyThing();
try { useResource( r); }
finally { r.release(); }  // close, destroy, etc

“最后”,还有一个提示: 如果 不厌其烦地放入一个 catch,要么捕获特定的(预期的)可抛出的子类,要么只捕获“ Throwable”,没有“ Exception”,这是一个一般的全捕获错误陷阱。太多的问题,比如反射错误,抛出“错误”而不是“异常”,这些问题会被编码为:

catch ( Exception e) ...  // doesn't really catch *all*, eh?

不如这样做:

catch ( Throwable t) ...

Finally 块在 try 块完成后执行。如果在 try 块离开时抛出了什么东西,那么就执行 finally 块。

关于 try/finally的一个小注释: finally 将始终执行,除非

  • System.exit()被称为。
  • JVM 崩溃了。
  • try{}块永远不会结束(例如无限循环)。

Java 语言规范 < em > (1) 描述了如何执行 try-catch-finally。 没有捕获等同于没有能够捕获给定 Throwable 的捕获。

  • 如果 try 块的执行由于抛出一个值 V 而突然完成,那么有一个选择:
    • 如果运行时类型 V 可赋值给 try 语句的任何 catch 子句的参数,则..。
      ...
    • 如果运行时类型 V 不可赋值给 try 语句的任何 catch 子句的参数 然后执行 finally 块。接下来是一个选择:
      • 如果 finally 块正常完成,那么 try 语句会因为值 V 的抛出而突然完成。
      • 如果 finally 块因为原因 S 突然完成,那么 try 语句因为原因 S 突然完成(值 V 的抛出被丢弃和遗忘)。

(1) Try-catch-finally 的执行

内部 finally 在将异常抛出到外部块之前执行。

public class TryCatchFinally {


public static void main(String[] args) throws Exception {


try{
System.out.println('A');
try{
System.out.println('B');
throw new Exception("threw exception in B");
}
finally
{
System.out.println('X');
}
//any code here in the first try block
//is unreachable if an exception occurs in the second try block
}
catch(Exception e)
{
System.out.println('Y');
}
finally
{
System.out.println('Z');
}
}
}

结果出来了

A
B
X
Y
Z

版本7之前的 Java 版本允许这三种 尝试,接住,终于组合..。

try - catch
try - catch - finally
try - finally

无论 try或/和 catch块中发生了什么,finally块都将始终执行。因此,如果没有 catch块,这里就不会处理异常。

但是,您仍然需要在代码中的某个地方使用异常处理程序——当然,除非您希望应用程序完全崩溃。这取决于应用程序的体系结构,该处理程序确切位于何处。

  • Java try 块后面必须跟着 catch 或 finally 块。
  • 对于每个 try 块,可以有零个或多个 catch 块,但是只有一个 finally 块。
  • 如果程序退出(或者通过调用 System.exit () ,或者通过导致进程中止的致命错误) ,finally 块将不会执行。

try块中,我们编写可以抛出异常的代码。 catch块是我们处理异常的地方。 无论是否发生异常,始终执行 finally块。

现在,如果我们使用 try-finally 块代替 try-catch-finally 块,那么将不会处理异常,在 try 块代替 control 后,异常将转到 finally 块。 当我们不想对异常执行任何操作时,可以使用 try-finally 块。

无论是否抛出异常,在 try块-finally块将被执行。异常将不会被捕获。