在下列情况下最终阻止会发生什么?

时间:2010-04-22 14:59:52

标签: java

如果我有以下代码

      try{

           //some code

      }catch(Exception e){

           //some code

      }finally{

      }

在以下情况下,finally块会发生什么

  1. 如果发生任何已检查的异常。

  2. 如果调用System.exit()。

  3. 如果发生任何未经检查的异常。

  4. 如果发生任何错误。

7 个答案:

答案 0 :(得分:9)

    执行
  1. finally阻止。

  2. 除非System.exit()抛出异常,否则不执行
  3. finally块,在这种情况下执行finally块。 (见How does Java's System.exit() work with try/catch/finally blocks?

  4. 执行
  5. finally阻止。

  6. 执行
  7. finally块(取决于错误的类型,如果你在谈论JVM错误,那么真的不知道会发生什么)。

答案 1 :(得分:3)

JLS 14.20.2 Execution of try-catch-finally

一切都清楚地说明了。 finally将始终在所有这些情况下执行,但成功的System.exit明显例外。

System.exit(int status)

  

终止 当前运行的Java虚拟机[...]此方法永远不会正常返回。

答案 2 :(得分:2)

  1. Finally将被执行。
  2. Finally将不会被执行,除非System.Exit()抛出异常。
  3. Finally将被执行。
  4. Finally将被执行。

答案 3 :(得分:1)

  • 1和3 - 将触发catch子句,然后触发finally子句
  • 4 - 仅触发finally子句
  • 3 - 程序将退出,finally将不会执行。这是因为“此方法永远不会正常返回。”如果finally抛出异常(System.exit(0)
  • ,将触发SecurityException

答案 4 :(得分:0)

假设finally块中没有4个项目发生,那么在代码退出之前将执行finally块,除非VM崩溃,然后所有的赌注都关闭。 的修改 System.exit()实际上绕过finally {}

答案 5 :(得分:0)

转义finally子句的唯一方法是System.exit。每隔一个案例就会到达finally块。

http://www.javaworld.com/javaworld/jw-02-1997/jw-02-hood.htm

http://java.sun.com/docs/books/jls/second_edition/html/exceptions.doc.html(第11.3节)

对此很好。

答案 6 :(得分:0)

1.如果发生任何已检查的异常。   代码流为

一个。试试......
   湾[检查例外]
   C。跳过try的其余部分并执行catch块以检查异常
   d。最后执行

2.如果调用System.exit()    终于被执行了。 3.如果发生任何未经检查的例外情况   一个。尝试...
  湾[未经检查的例外]
  C。跳过剩下的尝试,最后移动到   d。最后执行

4.如果发生任何错误。
 a.finally执行。但程序在JVM抛出“错误”之前是吐司的