3 回答

TA貢獻(xiàn)1788條經(jīng)驗 獲得超4個贊
如果到達(dá)return了該try塊中的in ,它將控制權(quán)轉(zhuǎn)移到該finally塊,該函數(shù)最終將正常返回(不是拋出)。
如果發(fā)生異常,但是代碼return從該catch塊到達(dá)a ,則控制權(quán)轉(zhuǎn)移到該finally塊,并且該函數(shù)最終正常返回(不是拋出)。
在你的榜樣,你有return在finally,所以不管發(fā)生什么情況,該函數(shù)將返回34,因為finally有最后的(如果你愿意)字。
盡管您的示例中未涉及,但即使您沒有,catch并且如果在try塊中引發(fā)了異常且未捕獲到異常,這也將是正確的。通過return從finally塊執(zhí)行a ,可以完全抑制異常??紤]:
public class FinallyReturn {
public static final void main(String[] args) {
System.out.println(foo(args));
}
private static int foo(String[] args) {
try {
int n = Integer.parseInt(args[0]);
return n;
}
finally {
return 42;
}
}
}
如果您在不提供任何參數(shù)的情況下運(yùn)行它:
$ java最終返回
...中的代碼foo引發(fā)ArrayIndexOutOfBoundsException。但是因為該finally塊執(zhí)行a return,所以該異常得到抑制。
這就是為什么最好避免使用returnin的原因之一finally。

TA貢獻(xiàn)1809條經(jīng)驗 獲得超8個贊
這是一些顯示其工作原理的代碼。
class Test
{
public static void main(String args[])
{
System.out.println(Test.test());
}
public static String test()
{
try {
System.out.println("try");
throw new Exception();
} catch(Exception e) {
System.out.println("catch");
return "return";
} finally {
System.out.println("finally");
return "return in finally";
}
}
}
結(jié)果是:
try
catch
finally
return in finally

TA貢獻(xiàn)1813條經(jīng)驗 獲得超2個贊
一個塊中的return
a catch
將“正?!蓖瓿?,而不是“突然”完成。從第11節(jié)中可以很明顯地看出這一點(diǎn):“在引發(fā)異常的過程中,Java虛擬機(jī)突然一個一個地完成了所有已經(jīng)開始但尚未完成的表達(dá)式,語句,方法和構(gòu)造函數(shù)調(diào)用,初始化程序以及字段初始化表達(dá)式。在當(dāng)前線程中執(zhí)行。”
添加回答
舉報