Java Try Catch Finally块没有Catch

Java Try Catch Finally blocks without Catch

我在复习一些新的代码。该程序只有一个try和finally块。由于catch块被排除在外,如果遇到异常或任何可丢弃的情况,try块如何工作?它是直接去最后一个街区吗?


如果try块中的任何代码都可以引发选中的异常,则它必须出现在方法签名的throws子句中。如果抛出未经检查的异常,则会从方法中冒泡出来。

无论是否引发异常,都始终执行finally块。


关于try/finally的一个小提示:最后一个总是执行,除非

  • 调用System.exit()
  • JVM崩溃。
  • try{}块永远不会结束(例如,无限循环)。


Java语言规范(1)描述了如何执行EDCOX1×4的执行。没有捕获等价于没有能够捕获给定的可丢弃项的捕获。

  • If execution of the try block completes abruptly because of a throw of a value V, then there is a choice:

    • If the run-time type of V is assignable to the parameter of any catch clause of the try statement, then …
    • If the run-time type of V is not assignable to the parameter of any catch clause of the try statement, then the finally block is executed. Then there is a choice:

      • If the finally block completes normally, then the try statement completes abruptly because of a throw of the value V.
      • If the finally block completes abruptly for reason S, then the try statement completes abruptly for reason S (and the throw of value V is discarded and forgotten).

(1)最后执行try catch


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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');
    }
  }
}

结果在

1
2
3
4
5
A
B
X
Y
Z

最后一个块总是在try块结束后运行,无论try是正常结束还是异常结束,都是由于异常、er、可丢弃。

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

如果finally块抛出一个异常/错误/可丢弃,并且已经有一个挂起的可丢弃,那么它会变得很难看。坦白地说,我完全忘记了发生了什么(多年前我的认证经历就是这样)。我认为两个被抛弃的人都联系在一起了,但是在"最终"呕吐物,呃,呕吐物吐出来之前,有一些特殊的巫术需要你去做(也就是说,我必须查找一个方法调用)。

顺便说一下,尝试/最后是一个非常常见的事情做的资源管理,因为Java没有析构函数。

例如

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

"最后一点",还有一个提示:如果您真的要放入catch,要么捕捉特定的(预期的)可丢弃的子类,要么只捕捉"可丢弃的",而不是"异常",对于一般的catch all错误陷阱。太多的问题,例如反射错误,抛出"错误",而不是"异常",这些问题将被任何代码为以下内容的"全部捕获"直接忽略:

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

改为这样做:

1
catch ( Throwable t) ...


版本7之前的Java版本允许这三个组合的尝试catch最后…

1
2
3
try - catch
try - catch - finally
try - finally

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

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

  • Java try block must be followed by either catch or finally block.
  • For each try block there can be zero or more catch blocks, but only one finally block.
  • The finally block will not be executed if program exits(either by calling System.exit() or by causing a fatal error that causes the process to abort).


how does the try block work if it
encounters an exception or anything
throwable

异常被抛出到块之外,就像在任何其他未被捕获的情况下一样。

不管try块是如何退出的,都会执行finally块——不管是否有任何捕获,不管是否有匹配的捕获。

catch块和finally是try块的正交部分。你可以两者兼得。用Java 7,你就不可能拥有!


在try块完成后执行finally块。如果在try块离开finally块时有东西被抛出,那么将执行finally块。


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