Java尝试赶上最后块没有Catch
我正在审查一些新的代码。 该程序只有一个try和一个finally块。 由于catch块被排除在外,如果try块在遇到exception或可抛出的情况时如何工作? 它是否直接进入到finally块?
如果try块中的任何代码都可以抛出一个检查exception,它必须出现在方法签名的throws子句中。 如果引发一个未经检查的exception,它将冒出方法。
finally块总是被执行,不pipe是否抛出exception。
try / finally中的一个小logging:finally将永远执行,除非
- System.exit()被调用。
- JVM崩溃。
- try {}块永远不会结束(例如无限循环)。
Java语言规范(1)描述了如何执行try-catch-finally
。 没有捕获就等于没有能够捕获给定的Throwable。
- 如果try块的执行由于抛出一个值V而突然完成,那么就有一个select:
- 如果V的运行时types可分配给try语句的任何catch子句的参数,则…
…- 如果V的运行时types不能分配给try语句的任何catch子句的参数, 则执行finally块 。 那么有一个select:
- 如果finally块正常完成,那么try语句突然完成,因为抛出了值V.
- 如果finally块由于S原因而突然完成,则对于原因S,try语句突然完成(并丢弃和丢弃值V的抛出)。
(1) try-catch-finally的执行
在抛出exception到外部块之前,内部最终被执行。
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
finally块总是在try块结束后运行,无论是正常结束还是exception结束,都是由于exception,呃,throwable。
如果try块中的任何代码都抛出exception,那么当前方法只是重新抛出(或继续抛出)相同的exception(在运行finally块之后)。
如果finally块抛出一个exception/错误/可抛出,并且已经有一个挂起的throwable,它会变得很难看。 坦率地说,我忘了到底发生了什么(几年前我的authentication非常多)。 我认为这两个throwables连在一起,但有一些特殊的巫术你必须做的(即 – 一个方法调用,我将不得不查找)在“最后”barfed,呃,抛出之前得到原来的问题。
顺便说一句,try / finally是资源pipe理的一个很常见的事情,因为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) ...
版本7之前的Java版本考虑到try-catch-finally的这三个组合
try - catch try - catch - finally try - finally
finally
块总是会被执行,无论try
或/ catch
块是怎么回事。 所以如果没有catch
块,这个exception将不会被处理。
但是,在你的代码中,你仍然需要一个exception处理程序 – 除非你希望你的应用程序完全崩溃。 这取决于你的应用程序的体系结构,恰恰在那个处理程序。
- Java尝试块必须跟在catch或finally块之后。
- 对于每个try块,可以有零个或多个catch块,但只有一个finally块。
- 如果程序退出(通过调用System.exit()或导致导致进程中止的致命错误),finally块将不会被执行。
如果遇到exception或任何可抛出的情况,try块是如何工作的
就像在其他情况下没有被捕获一样,exception被抛出块。
不pipetry块是如何退出的,finally块都被执行 – 无论是否存在任何catch,无论是否有匹配catch。
catch块和finally块是try块的正交部分。 你可以有一个或两个。 使用Java 7,您将无法拥有!
你不用这个程序试试吗? 它会终于阻止并执行finally块,但是,exception将不会被处理。 但是,这个例外可以在finally块中被否决!
finally块在try块完成后执行。 如果try块中有内容被抛出,finally块被执行。