zoukankan      html  css  js  c++  java
  • finally是否执行?finally何时执行?

    一、finally是否执行:

    1.只有与 finally 相对应的 try 语句块得到执行的情况下,finally 语句块才会执行
    当finally 相对应的 try 语句块之前,已经抛出错误,或者已经返回,return,就不会执行finally

    2.当与 finally 相对应的 try 语句块中有 System.exit(int status) ,并且顺利执行,finally 语句块也不会执行
    System.exit(int status) 会终止 Java 虚拟机的运行
    类似的情况还有:线程被中断,interrupted,进程被终止,killed,死机、断电等

    二、finally何时执行:

    1.Java 虚拟机会把 finally 语句块作为 subroutine 直接插入到 try 语句块或者 catch 语句块的控制转移语句之前。
    控制转移语句:return、throw 和 break、continue

    2.对于有返回值的 return 和 throw 语句,在执行 subroutine 之前,try 或者 catch 语句块会保留其返回值到本地变量表(Local Variable Table)中。
    待 subroutine 执行完毕之后,再恢复保留的返回值到操作数栈中,然后通过 return 或者 throw 语句将其返回给该方法的调用者(invoker)。

     1 public class Test {
     2 
     3     public static void main(String[] args) {
     4         System.out.println(testFinally());
     5     }
     6 
     7     public static int testFinally() {
     8         int i = 1;
     9         // if(i == 1)
    10         // return 0;
    11         System.out.println("before try");
    12         i = i / 0;
    13         try {
    14             System.out.println("try");
    15             //System.exit(0); 
    16             return i;
    17         } finally {
    18             System.out.println("finally");
    19         }
    20     }
    21 }
    例子1
     1 public class Test {
     2 
     3     public static void main(String[] args) {
     4         System.out.print(testFinally());
     5     }
     6 
     7     public static int testFinally() {
     8         int b = 10;
     9         try {
    10             System.out.println("try");
    11             return b += 20;
    12         } catch (Exception e) {
    13             System.out.println("error:" + e);
    14         } finally {
    15             System.out.println("finally");
    16             System.out.println("b:" + b);
    17             b = 50;
    18             System.out.println("b:" + b);
    19         }
    20         return 40;
    21     }
    22 }
    例子2
  • 相关阅读:
    SQL易错总结1
    线程池使用总结
    多线程的上下文切换
    SQL 排序按指定内容优先排序
    System x 服务器制作ServerGuide U盘安装Windows Server 2008 操作系统 --不格式化盘
    错误“该伙伴事务管理器已经禁止了它对远程/网络事务的支持”解决方案
    sql server 2012 链接服务器不能链接sql server 2000的解决方案 ,
    sqlserver2005版本的mdf文件,还没有log文件,
    BCP SQL导出EXCEL常见问题及解决方法;数据导出存储过程
    Nginx
  • 原文地址:https://www.cnblogs.com/guodefu909/p/5791427.html
Copyright © 2011-2022 走看看