---------------------- 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培训、期待与您交流! -------