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块被执行。