try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?

一, 

package demo;

public class tryDemo {
    private static int see(){
        int s = 0;
        try{
            s +=2;
            System.out.println("执行完try");
            return s;
        }catch(Exception e){
            return s+1;
        }finally{
            System.out.println("执行完finally");
            
        }
    }
    public static void main(String[] args) {
        int a = see();
        System.out.println("a : "+ a );
    }
}

运行结果:

执行完try
执行完finally
a : 2

说明,如果 try当中有return 的话, 先执行完return中的语句,在执行finally中的语句,最后 返回 try 中的 return。

二,如果 finally当中也有 return呢 ?

package demo;

public class tryDemo {
    private static int see(){
        int s = 0;
        try{
            s +=2;
            System.out.println("执行完try");
            return s;
        }catch(Exception e){
            return s+1;
        }finally{
            System.out.println("执行完finally");
            return s+3;
            
        }
    }
    public static void main(String[] args) {
        int a = see();
        System.out.println("a : "+ a );
    }
}

输出结果:

执行完try
执行完finally
a : 5

说明: 这种情况下,不执行 try当中的 return ,最后返回的是 finally 中的值 。

三 ,

如果 try当中有 return s,

finally没有 return, 但在 finally 中 有 对 s 的操作,那么 try 当中的 return  s 是 更改后的 s 吗?

package demo;

public class tryDemo {
    private static int see(){
        int s = 0;
        try{
            s +=2;
            System.out.println("执行完try");
            return s;
        }catch(Exception e){
            return s+1;
        }finally{
            System.out.println("执行完finally");
            s +=1;
            //s=5;
            
        }
    }
    public static void main(String[] args) {
        int a = see();
        System.out.println("a : "+ a );
    }
}

输出结果:

执行完try
执行完finally
a : 2

说明, finally当中的 对 s 的修改 并不对 try当中的 return 值产生影响。

四,针对 int类型 和 List 类型的一个小区别

1,针对 int 类型

package tuling;

import java.util.ArrayList;
import java.util.List;

public class ErrorAndThr0 {
        public static void main(String[] args) {
            int a = test();
            System.out.println("a = "+ a);
        }
        
        private static int test(){

            int i = 0;
            try{
                i++;
                System.out.println("try block,i = " + i);
                return i;
            }catch(Exception e){
                i++;
                System.out.println("catch block , i = "+ i );
                return i;
            }finally{
                i++;
                System.out.println("finally block, i = "+ i);
            }
        
        }

    


}

输出结果:

try block,i = 1
finally block, i = 2
a = 1

我们看下.class文件反编译的源代码:

 当然 ,红色 的部分 还未得到证实, 我是看  03-Exception和Error的区别-杨过 的 第 16分钟 是这么说的 。 

2, 针对 List 类型

package tuling;

import java.util.ArrayList;
import java.util.List;

public class ErrorAndThr {
    public static void main(String[] args) {
        List <String> list = test();
        System.out.println("list : "+ list.toString());
    }
    
    private static List test(){

        List <String> list = new ArrayList<String>();
        try{
            list.add("step try");
            System.out.println("try block");
            return list;
        }catch(Exception e){
            list.add("step catch");
            System.out.println("catch block");
            return list;
        }finally{
            list.add("step finally");
            System.out.println("finally block");
        }
    
    }

}

输出结果:

try block
finally block
list : [step try, step finally]

我们看下.class文件反编译的源代码:

 说明,针对 list类型,finally类型的操作会影响 try 当中return的结果。

原文地址:https://www.cnblogs.com/william-dai/p/13322071.html