java try 返回值_java try finally返回值问题

需要知道的是:finally的语句会先于try或者catch的返回语句之前执行,如果finally中有return语句,那么try或catch中的return语句会被finally中的return覆盖,不建议在finally中放return

情况一:try、catch和finally中都有return

public static void main(String[] args) {

System.out.println(testInt());

}

private static int testInt(){

int a = 0;

try{

return a;

}catch (Exception e){

a = 9;

e.printStackTrace();

return a;

}finally {

a = 10;

return a;

}

}

最后输出:

10

在try中的return执行之前,会执行finally中的语句,finally中有return,于是会覆盖掉try中的return。如果此时发生了异常,catch中的return语句会执行吗?看下面:

public static void main(String[] args) {

System.out.println(testInt());

}

private static int testInt(){

int a = 0;

try{

int b = 7/a; //产生了异常

return a;

}catch (Exception e){

a = 9;

e.printStackTrace();

return a;

}finally {

a = 10;

return a;

}

}

输出结果:

10

java.lang.ArithmeticException: / by zero

at pattern.App.testInt(App.java:40)

at pattern.App.main(App.java:31)

产生了异常,catch中语句被执行,但是catch中的return执行之前会执行finally中的语句,所以catch中的return依然被覆盖

情况二:try或者catch中有return,finally中没有return

public static void main(String[] args) {

System.out.println(testInt());

}

private static int testInt(){

int a = 0;

try{

return a;

}catch (Exception e){

a = 9;

e.printStackTrace();

return a;

}finally {

System.out.println("执行finally");

a = 10;

}

}

输出:

执行finally

0

可以看到,finally中的语句依然执行了,但是a的值在finally中改变了,返回值并没有改变,如果这里产生了异常呢?自然是会输出9的(可以自己验证一下),这里可以看到对于基本类型a,finally的赋值并没有改变返回值,如果是下面非基本类型的情况呢?

情况三:对于非基本类型

public static void main(String[] args) {

System.out.println(testNum().getNum());

}

private static Num testNum(){

Num num = new Num();

int a = 0;

try{

num.setNum(7);

return num;

}catch (Exception e){

e.printStackTrace();

num.setNum(9);

}finally {

num.setNum(10);

}

return num;

}

最后输出结果:

10

同理如果是产生了异常,结果仍然是10(可以自己验证)

可以看到,对于非基本类型,finally中的赋值最后在return中会被返回,通过看向志明《深入理解Java虚拟机》第187页讲解“class文件的属性表”的时候,找到了为什么:

不管什么情况,finally中的语句总会执行(除非程序执行System.exit()),正常情况下载try后面执行,抛异常时载catch后面执行

对于返回值问题。try(或者catch)中的return语句的返回值放入线程栈的顶部:如果返回值是基本类型则顶部存放的就是值,如果返回值是引用类型,则顶部存放的就是地址。finally中的return语句可以修改引用所对应的对象,无法修改基本类型。所以情况二中的基本类型finally无法修改,但是情况三可以修改

不建议在finally中使用return

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值