【黑马程序员】关于try和fianlly中的return执行问题总结

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

我们都知道finally语句块的作用是无论出现什么情况,finally块中的语句一定会被执行,并且是在return之前执行。既然在finally块中的语句一定会被执行,那么finally中可以改变try中对象的值吗?执行顺序是怎么样的呢?


1.第一种情况请看testTry1();

在控制台输出字符来证明try语句块中return后finally中的代码是否被执行。

控制台输出结果为:

testTry1
testTry1

分析:try语句return后finally中的代码是会被执行的。只是finally中改变try中的值没被返回所以值不变。


2.第二种情况请看testTry2();

在控制台输出字符来证明try语句块中return后finally中的代码是否被执行。finally和try语句块中都有return,那么结果如何呢?

控制台输出结果为:

testTry2testTry2。

分析:当finally和try中都有return的话,则返回值为finally语句块中的返回值。


2.第二种情况请看testTry3();

在控制台输出字符来证明try语句块中return后catch后finally中的代码是否被执行。finally和try和catch语句块中都有return,那么结果究竟返回值返回的是谁的内容呢?

控制台输出结果为:

try
找不到指定文件
finally
testTry3testTry3testTry3

分析结果:try,catch,finally中都有return的情况下,最终返回值为在finally修改后的值.


package com.itheima;


import java.io.FileInputStream;
import java.io.FileNotFoundException;


public class Test8 {


//finally语句块的作用是无论出现什么情况,finally块中的语句一定会被执行,并且是在return之前执行。
//根据JAVA规范,如果try-finally或者catch-finally中都有return,则2个return都执行并最终返回调用者那里的是finally中的return
//如果finally中没有return则返回的是catch中的return,但是finally中的代码也是要执行的。
public static void main(String[] args) {
// TODO Auto-generated method stub
Test8 t=new Test8();

System.out.println(t.testTry1());

System.out.println(t.testTry2());

System.out.println(t.testTry3());
}

//在控制台输出字符来证明finally是否被执行,在testTry1()中try中的sb被存储在一个临时区域内。
//finally中改变了sb的值,但是没有return,所以sb的值为“testTry1”。
public String testTry1(){
StringBuilder sb=new StringBuilder();
try{
sb.append( "testTry1");  
return sb.toString();
}finally{
System.out.println("testTry1");
sb.append( "testTry1");
}
}

//finally中改变了sb的值,如果有return,则sb的值为“testTry2testTry2”。
public String testTry2(){
StringBuilder sb=new StringBuilder();
try{
sb.append( "testTry2");  
return sb.toString();
}finally{
sb.append( "testTry2");
return sb.toString();
}
}

//try,catch,finally中都有return的情况下,最终返回在finally修改后的值.
public String testTry3(){
StringBuilder sb=new StringBuilder();
FileInputStream in = null;
try{
sb.append( "testTry3");  
System.out.println("try");
in=new FileInputStream("C:\\exist");
return sb.toString();
}catch(FileNotFoundException e){

System.out.println("找不到指定文件");
sb.append( "testTry3");  
return sb.toString();
}
finally{
System.out.println("finally");
sb.append( "testTry3");  
return sb.toString();
}
}


}


------- Windows Phone 7手机开发.Net培训、期待与您交流! -------

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值