您的位置:首页 > 职场人生

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

2013-11-13 14:12 441 查看
----------------------
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之前执行。
//根据J***A规范,如果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培训、期待与您交流! -------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐