zoukankan      html  css  js  c++  java
  • finall语句是在return语句执行前被执行还是执行后被执行?

                                                      finally对try...catch的影响和执行时间

    一.finally语句不被执行的两种情况

     我们在学习抛出异常的时候学习到了finally语句块,这个语句块一般会被执行,但是有两种情况下不被执行

    1.如果try语句或者catch语句里存在强制退出语句System.exit(0),代表虚拟机被终止。

    2.在执行try...catch语句前已经有了return语句返回,后面的程序不再被执行。

    二.finally语句什么时候被执行

       我们进行以下测试:

    public class Test{
    
        public static void main(String[] args) {
            
            System.out.println(test1());
        }
    
        public static int test1() {
            int b = 20;
    
            try {
                System.out.println("try block");
    
                return b += 80; 
            }
            catch (Exception e) {
    
                System.out.println("catch block");
            }
            finally {
                
                System.out.println("finally block");
                
                if (b > 25) {
    b=200; System.
    out.println("b>25, b = 200"); } } return b; } }

    执行结果为:

    try block
    finally block
    b>25, b = 200
    100

    以上结果说明:在try中的return语句已经执行了,这时没有进行返回操作,而是转而进入到finally语句中去执行,finally语句执行完后,在进行返回操作。

    二.return位置不同造成的不同结果

    我们可以从两种情况进行分析:

    1.finally语句中没有return。

    2.finally语句中有return。

    对于第一种情况我们已经做了测试,如上面的代码所示,finally语句中对b进行了改值操作,但是返回值依然是try中的b值,原理是当在try中执行b += 80;操作后,将b值临时存储在栈中,并将运算结果赋值给b,这是会进行一个保护操作,会把b存储到另一个局部变量中进行保护性存储,然后进入finally语句中,将栈中的b值进行更改,但是在进行返回操作时,会将保护存储变量中的值重新返回到栈顶中,return进行出栈操作,将try中的b取出来。

    详情可以参考:https://blog.csdn.net/abinge317/article/details/52253768

    如果finally中有return,我们就会在finally中进行返回。

    示例如下:

    public int test() {
            int i=0;
            try {
                i = 1;
                return i;
            } finally {
                i = 2;
                return i;
            }
        }

    结果为2;

    但是如果return的不是基本数据类型,而是引用数据类型,那么及时finally语句块中没有return,数据也会改变。String类除外。

    为什么引用数据类型都可以,String就不行哪?是因为String有安全保护机制。可以参考这篇文章https://www.cnblogs.com/zzuli/p/9381266.html

  • 相关阅读:
    TCP连接之报文首部
    Django基础篇--用户权限管理和组管理
    MySQL聚簇索引
    浅谈Redis之慢查询日志
    Django基础篇--模板和路由分发
    Django--数据库查询操作
    Django基础篇--Models
    Sqlautocode使用过程的一些坑
    关于域名的一点事
    unicode编码和utf8编码的区别
  • 原文地址:https://www.cnblogs.com/zzuli/p/9397332.html
Copyright © 2011-2022 走看看