1. 程式人生 > >【黑馬程式設計師】關於try和fianlly中的return執行問題總結

【黑馬程式設計師】關於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();
}
}


}