finally与return的先后顺序

上一段代码

 

  public static int testTry(){
        int i = 1;
        try {
            i++;
            System.err.println("我是try中return前的正常方法...."+i);
            return i;
        }catch (Exception e){
            i++;
            System.err.println("我是catch中的方法执行...."+i);
        }finally {
            i++;
            System.err.println("我是finally中的正常方法....."+i);
        }
        System.err.println("我是try catch外的方法,我执行了吗?");
        return i;
    }
    public static int testCatch(){
        int i = 1;
        try {
            int i1 = i / 0;
            System.err.println("我是try中return前的正常方法...."+i);
        }catch (Exception e){
            i++;
            System.err.println("我是catch中的方法执行...."+i);
            return i;
        }finally {
            i++;
            System.err.println("我是finally中的正常方法....."+i);
        }
        System.err.println("我是try catch外的方法,我执行了吗?");
        return i;
    }
    public static void main(String[] args) {
        int i = testTry();
        System.err.println("testTry方法执行结束...."+i);
        System.err.println("=========================================");
        int i1 = testCatch();
        System.err.println("testCatch方法执行结束..."+i1);
    }

 

 

 

总结:

基本数据类型

finally最终都会执行;

return 之前的数据不会变化,即使后面finally对数据进行了增加;

 

public static List testTry(){
        List result = new ArrayList();
        try {
            result.add("1");
            System.err.println("我是try中return前的正常方法...."+result.size());
            return result;
        }catch (Exception e){
            result.add("2");
            System.err.println("我是catch中的方法执行...."+result.size());
        }finally {
            result.add("3");
            System.err.println("我是finally中的正常方法....."+result.size());
        }
        System.err.println("我是try catch外的方法,我执行了吗?");
        return result;
    }
    public static List testCatch(){
        List result = new ArrayList();
        try {
            Object o = result.get(100);
            System.err.println("我是try中return前的正常方法...."+result.size());
        }catch (Exception e){
            result.add("5");
            System.err.println("我是catch中的方法执行...."+result.size());
            return result;
        }finally {
            result.add("6");
            System.err.println("我是finally中的正常方法....."+result.size());
        }
        System.err.println("我是try catch外的方法,我执行了吗?");
        return result;
    }
    public static void main(String[] args) {
        int i = testTry().size();
        System.err.println("testTry方法执行结束...."+i);
        System.err.println("=========================================");
        int i1 = testCatch().size();
        System.err.println("testCatch方法执行结束..."+i1);
    }

此时验证的结果就会发现,当时引用数据类型的时候,这个值就变化了....

一个是基本数据类型,一个是引用数据类型,这样就很容易理解了....

引用数据类型拿到是List的地址库引用,后期对该引用对应的值进行了更改,所以再去size的时候,是有变化的,也是可以解释得通的..并不悖于上面的结论;

return先将结果保留,等执行完finally后再返回给调用者;

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章