Finally 區塊對回傳值的影響
在 Java 中,finally 區塊對方法傳回值的行為可能是違反直覺的。讓我們分析一段程式碼片段,深入探討造成這種現象的根本原因。
考慮以下程式碼:
public class Test { private String s; public String foo() { try { s = "dev"; return s; } finally { s = "override variable s"; System.out.println("Entry in finally Block"); } } public static void main(String[] xyz) { Test obj = new Test(); System.out.println(obj.foo()); } }
執行時,程式碼會列印“Entry infinallyBlock”,但回傳“開發。”這是因為傳回值是由try區塊中return語句的執行決定的。 finally 區塊中對 's' 所做的變更發生在 try 區塊完成之後,因此不會反映在回傳值中。
需要注意的是,這適用於 's' 值的變更本身,而不是物件引用的變更。如果 's' 是對可變物件的引用,並且其內容在 finally 區塊中更改,則這些變更將在傳回值中可見。
Java 語言規格 (JLS) 概述了此操作的詳細規則第 14.20.2 節中的行為。對於try-finally語句,如果try區塊和finally區塊都有return語句,則以finally區塊的回傳值為準。這是因為 return 語句的執行被視為區塊的突然終止。
總而言之,方法的回傳值由 try 區塊中的 return 語句決定。對finally 區塊中的變數所做的更改,無論是值或透過物件修改,都不會影響回傳值,除非finally 區塊也包含return 語句。
以上是Final 區塊如何影響 Java 中方法的回傳值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!