Try…catch…finally

研究问题:

  1. try…catch…finally语句中含有return语句的执行情况?
  2. catch中return而finally返回顺序?

要点:
  • try语句在返回前,将其他所有的操作执行完,保留好要返回的值,而后转入执行finally中的语句,而后分为以下三种情况:
      情况一:如果finally中有return语句,则会将try中的return语句”覆盖“掉,直接执行finally中的return语句,得到返回值,这样便无法得到try之前保留好的返回值。
      情况二:如果finally中没有return语句,也没有改变要返回值,则执行完finally中的语句后,会接着执行try中的return语句,返回之前保留的值。
      情况三:如果finally中没有return语句,但是改变了要返回的值,这里有点类似与引用传递和值传递的区别,分以下两种情况,:
     1)如果return的数据是基本数据类型或文本字符串,则在finally中对该基本数据的改变不起作用,try中的return语句依然会返回进入finally块之前保留的值。
     2)如果return的数据是引用数据类型,而在finally中对该引用数据类型的属性值的改变起作用,try中的return语句返回的就是在finally中改变后的该属性的值。
     来自 http://blog.csdn.net/ns_code/article/details/17485221

截图展示区:
  1. 情况一(try中有return,finally中没有return):
public class TryTest{
    public static void main(String[] args){
        System.out.println(test());
    }

    private static int test(){
        int num = 10;
        try{
            System.out.println("try");
            return num += 80;
        }catch(Exception e){
            System.out.println("error");
        }finally{
            if (num > 20){
                System.out.println("num>20 : " + num);
            }
            System.out.println("finally");
        }
        return num;
    }
}

引用块内容

2. 情况二(try和finally中均有return):

public class TryTest{
    public static void main(String[] args){
        System.out.println(test());
    }

    private static int test(){
        int num = 10;
        try{
            System.out.println("try");
            return num += 80;
        }catch(Exception e){
            System.out.println("error");
        }finally{
            if (num > 20){
                System.out.println("num>20 : " + num);
            }
            System.out.println("finally");
            num = 100;
            return num;
        }
    }
}

引用块内容

3. 情况三(finally中改变返回值num):

public class TryTest{
    public static void main(String[] args){
        System.out.println(test());
    }

    private static int test(){
        int num = 10;
        try{
            System.out.println("try");
            return num;
        }catch(Exception e){
            System.out.println("error");
        }finally{
            if (num > 20){
                System.out.println("num>20 : " + num);
            }
            System.out.println("finally");
            num = 100;
        }
        return num;
    }
}

这里写图片描述

4. 将num的值包装在Num类中

    public class TryTest{
        public static void main(String[] args){
            System.out.println(test().num);
        }

        private static Num test(){
            Num number = new Num();
            try{
                System.out.println("try");
                return number;
            }catch(Exception e){
                System.out.println("error");
            }finally{
                if (number.num > 20){
                    System.out.println("number.num>20 : " + number.num);
                }
                System.out.println("finally");
                number.num = 100;
            }
            return number;
        }
    }

    class Num{
        public int num = 10;
}

引用块内容

5.

    package com.java.FinalKey;

    /* final/finally/finalize
     * final:修饰类、变量、方法
     * finally:用于异常处理
     * finalize:object类方法,用于垃圾回收
     */
    public class FinallyDemo2 {
        public static void main(String[] args) {
            System.out.println(getInt());
        }

        public static int getInt() {
            int a = 10;
            try {
                System.out.println(a / 0);
                a = 20;
            } catch (ArithmeticException e) {
                a = 30;
                return a;
            } finally {
                a = 40;
            }
            return a;
        }
}

引用块内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值