Java Try Catch Finally blocks without Catch
我在复习一些新的代码。该程序只有一个try和finally块。由于catch块被排除在外,如果遇到异常或任何可丢弃的情况,try块如何工作?它是直接去最后一个街区吗?
如果try块中的任何代码都可以引发选中的异常,则它必须出现在方法签名的throws子句中。如果抛出未经检查的异常,则会从方法中冒泡出来。
无论是否引发异常,都始终执行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 |
改为这样做:
1 |
版本7之前的Java版本允许这三个组合的尝试catch最后…
1 2 3 | try - catch try - catch - finally try - finally |
无论
但是,在代码中的某个地方仍然需要一个异常处理程序——当然,除非您希望应用程序完全崩溃。它完全取决于应用程序的体系结构,即处理程序所在的位置。
- 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块中被否决!