【黑馬程式設計師】關於try和fianlly中的return執行問題總結
阿新 • • 發佈:2019-02-13
---------------------- 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(); } } }