1. 程式人生 > >你真的瞭解try{ return }finally{}中的return嗎?

你真的瞭解try{ return }finally{}中的return嗎?

誰能給我我解釋一下這段程式的結果為什麼是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,那麼程式碼的行為如下:

  1. 如果有返回值,就把返回值儲存到區域性變數中。
  2. 執行JSR指令跳到finally語句裡執行。
  3. 執行完finally語句後,返回之前儲存在區域性變量表裡的值。

位元組碼檔案解析:

這裡寫圖片描述

大概講講指令操作順序:

iconst_1: 把常數1進棧 —> istore_1: 棧頂元素出棧並把元素儲存在本地變量表的第二個位置裡(下標為1的位置裡) —> iinc 1, 1 : 本地變量表的第二個元素自增1 —>iload_1:第二個元素進棧 —> istore_2:棧頂元素出棧並把元素儲存在本地變量表的第2個位置裡 —> iinc 1, 1 : 本地變量表的第二個元素自增1 —> iload_2:第二個元素進棧 (注意,此時棧頂元素為2)—> ireturn:返回棧頂元素。

上面流程棧和本地變量表的情況如下圖:

這裡寫圖片描述