异常捕获时的return和finally

以前一直认为在try,catch,finally中,try中的return 会在finally之后运行,今天和同事遇到,然后重新测试了一下,代码如下:

/**
     * 主方法
     * 
     * @param args
     */
    public static void main(String[] args) {
        exexute();
    }
    
    /**
     * 测试方法
     * 
     * @return
     */
    private static int exexute() {
        try {
            System.out.println("this is atest");
            return exexutea();
        }
        catch (Exception ex) {
            ex.printStackTrace();
        }
        finally {
            System.out.println("finally");
        }
        return 0;
    }
    
    /**
     * return 方法
     * 
     * @return
     */
    private static int exexutea() {
        System.out.println("exexutea");
        return 1;
    }

执行结果是:

this is atest
exexutea
finally

觉得和自己想的不太一样吧。发现自己的记性不太好了...


后来在网上查询,看到有网友举了另外一个例子,来研究是不是finally对return 是不是有影响。

网友举了两个例子,一个是return 简单数据类型,另一个是放回包装数据类型。代码如下:

简单数据类型的例子:

/**
     * 主方法
     * 
     * @param args
     */
    public static void main(String[] args) {
        
        int re = executeSimple();
        System.out.println(re);
    }
    
    /**
     * 测试简单数据类型
     * 
     * @return
     */
    private static int executeSimple() {
        
        int i = 10;
        try {
            System.out.println("this is a test simple");
            return i;
        }
        catch (Exception ex) {
            ex.printStackTrace();
        }
        finally {
            i = 5;
        }
        return i;
    }

执行结果是:

this is a test simple
10

看来finally的赋值并没有对return造成影响

包装数据类型的例子:

    /**
     * 主方法
     * 
     * @param args
     */
    public static void main(String[] args) {
        
        StringBuilder re = executeComplex();
        System.out.println(re.toString());
    }

    /**
     * 测试简单数据类型
     * 
     * @return
     */
    private static StringBuilder executeComplex() {
               
        StringBuilder sb = new StringBuilder("123");
        try {
            System.out.println("this is a test simple");
            return sb;
        }
        catch (Exception ex) {
            ex.printStackTrace();
        }
        finally {
            sb.append("321");
        }
        return sb;
    }

执行结果:

this is a test simple
123321

执行结果受到了finally的影响。

虚拟机栈中的返回分简单数据类型和复杂数据类型,如果是简单数据类型,虚拟机栈直接记录的是字面量,如果是复杂数据类型,那么虚拟机记录的引用,所以在第二个例子中,改变了引用对象的内容,return 以后,引用的内容就改变了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值