關於try...catch...finally里面的return一直是面試的一個熱門考點。無非就分以下幾個情況:
1、當有finally語句並且try中有return,在執行到return(還未執行)的時候,會先執行finally里面的內容,然后再執行行try中的return。
package com.and.java.demo; public class 測試 { public static void main(String[] args) { System.out.println(new 測試().test()); } public String test() { try { System.out.println("try{...}"); return "try"; } catch (Exception e) { System.out.println("catch{...}"); return "catch"; } finally { System.out.println("finally{...}"); } } }
輸出:
try{...} finally{...} try
2、在1的基礎上,如果finally里面也有return語句,則try代碼塊中的return被屏蔽(不執行),即在try中遇到return的時候,會先執行finally里面的內容(包括finally里面的return語句)。
package com.and.java.demo; public class 測試 { public static void main(String[] args) { System.out.println(new 測試().test()); } public String test() { try { System.out.println("try{...}"); return "try"; } catch (Exception e) { System.out.println("catch{...}"); return "catch"; } finally { System.out.println("finally{...}"); return "finally"; } } }
輸出:
try{...} finally{...} finally
遇到的問題:
這兩種情況想必大家已經掌握。但是還有一種情況,也是我不能理解的地方。一般情況下,在finally里面作一些數據的關閉操作(比如文件,輸入/輸出流,數據庫的關閉),試想一下,要是我們在finally里面對要返回的值進行修改,那會反應到最終的結果上去嗎?(因為從上面的講解可以知道,當try里面有return的時候,它不會立刻執行,會先執行finally里面的內容,然后再執行return)。
package com.and.java.demo; public class 測試 { public static void main(String[] args) { System.out.println(new 測試().test()); } public String test() { String result = ""; try { result = "try"; return result; } catch (Exception e) { result = "catch"; return result; } finally { result = "finally"; } } }
試想一下,它會輸出"try" 呢還是"finally"呢?
輸出:
try
確實只輸出try,但是我們在finally里面是改變了result的值呀?
再進一步改進,判斷finally里面的賦值語句是否執行
package com.and.java.demo; public class 測試 { public static void main(String[] args) { System.out.println(new 測試().test()); } public String test() { String result = ""; try { result = "try"; return result; } catch (Exception e) { result = "catch"; return result; } finally { System.out.println("t1->"+result); result = "finally"; System.out.println("t2->"+result); } } }
輸出:
t1->try t2->finally try
從輸出結果可以看出,finally里面的賦值語句是執行了的,但是在return結果中怎么就沒變呢?(目前暫時研究到這個地步,仍沒搞明白,還望各位高手指點)