zoukankan      html  css  js  c++  java
  • java中Finally块的执行

    在try{}catch{}finally{}块中,都知道finally子块是肯定会执行的。当然也有个别情况,当在try{}或者catch{}块中出现强制退出System.exti(int)时,finally子块就不会执行了。这种情况不在今天的谈论范围以内。 
    看代码更加直观些: 

    Java代码  收藏代码
    1. package practice;  
    2.   
    3. public class FinallyRun {  
    4.     private int a = 0;  
    5.   
    6.     public int getInt() {  
    7.         try {  
    8.             a = 1;  
    9.             return a;  
    10.         } finally {  
    11.             a = 2;  
    12. //          return a;  
    13.         }  
    14.     }  
    15.   
    16.     public static void main(String[] args) {  
    17.         FinallyRun f = new FinallyRun();  
    18.         int tmp = f.getInt();  
    19.         System.out.println("f.getInt() = " + tmp);  
    20.         System.out.println("f.a = " + f.a);  
    21.     }  
    22.   
    23. }  


    我在a=1出打了断点,单步跟踪发现:尽管try中包含return,并且try中的return语句执行完,程序就会跳到finally中,继续跑下去,然后返回退出getInt()方法。结果如下: 

    Java代码  收藏代码
    1. f.getInt() = 1  
    2. f.a = 2  


    从结果中可以看出,getInt()方法返回值的1,而变量a的值为2。把代码中的注释取消,运行程序结果如下: 

    Java代码  收藏代码
    1. f.getInt() = 2  
    2. f.a = 2  


    这次变量a的值和方法返回值都为2。 
    过程比较简单。在try{}中return执行后,会带着这个return流进入finally子块中,虽然finally中修改了变量a的值,但是没有影响到return流中的数据;如果finally中也有return语句,那么finally子块中的return流就会覆盖之前try{}中的return流,然后从方法退出。 

    如有不对,敬请指正。

  • 相关阅读:
    [转载] 美团-云鹏: 写给工程师的十条精进原则
    Docker测试一个静态网站
    Docker容器访问外部世界
    Docker容器间通信
    Docker网络(host、bridge、none)详细介绍
    Docker的资源限制(内存、CPU、IO)详细篇
    esxi中CentOS7不停机加磁盘并扩容现有分区
    ESXI6.5安装CentOS7教程
    Linux查看占用CPU和内存的 的程序
    Centos7使用脚本搭建LVS的DR模式。
  • 原文地址:https://www.cnblogs.com/dyllove98/p/4100733.html
Copyright © 2011-2022 走看看