你真的瞭解try{ return }finally{}中的return嗎?
阿新 • • 發佈:2019-01-23
誰能給我我解釋一下這段程式的結果為什麼是2而不是3?
class Test {
public int aaa() {
int x = 1;
try {
return ++x;
} catch (Exception e) {
} finally {
++x;
}
return x;
}
public static void main(String[] args) {
Test t = new Test();
int y = t.aaa();
System.out.println(y);
}
}
解答:
如果try語句裡有return,那麼程式碼的行為如下:
- 如果有返回值,就把返回值儲存到區域性變數中。
- 執行JSR指令跳到finally語句裡執行。
- 執行完finally語句後,返回之前儲存在區域性變量表裡的值。
位元組碼檔案解析:
大概講講指令操作順序:
iconst_1: 把常數1進棧 —> istore_1: 棧頂元素出棧並把元素儲存在本地變量表的第二個位置裡(下標為1的位置裡) —> iinc 1, 1 : 本地變量表的第二個元素自增1 —>iload_1:第二個元素進棧 —> istore_2:棧頂元素出棧並把元素儲存在本地變量表的第2個位置裡 —> iinc 1, 1 : 本地變量表的第二個元素自增1 —> iload_2:第二個元素進棧 (注意,此時棧頂元素為2)—> ireturn:返回棧頂元素。
上面流程棧和本地變量表的情況如下圖: