JAVA Try Catch Finally 代碼執行順序

    public void test () {
        //1
       throw new RuntimeException();
        //2
    }

基本知識

如果有錯誤,不進行try-catch則會編譯報錯。

    public void test () {
        try {
        // 1
            throw new NullPointerException();
        //2
        } catch (RuntimeException r) {
        //3 
        } catch (Exception e) {
        //4
        } finally {
        //5
        }
        //6
    }

基本知識

try-catch中,可以有多個catch,但是catch的錯誤的類型,從上到下應該是越靠近try的catch的錯誤類型要越精確,範圍越小,不然會編譯報錯,而且錯誤只會被, 舉個例子:雖然RuntimeException也是Exception,如果你throw出來的是NullPointerException,NullPointerException雖然是Exception,也是RuntimeException,但是如上圖代碼所示,會優先匹配最靠近這個Exception 的catch,且只會被一個catch匹配,,所以會執行3號區域代碼,然後執行5號區域代碼,最後執行6號區域代碼。

    public void test () {
        try {
        // 1
            throw new NullPointerException();
        //2
        } catch (RuntimeException r) {
        //3 
        } catch (Exception e) {
        //4
        } finally {
        //5
        }
        //6
    }

執行順序如下:

  1. 執行1號區域代碼
  2. 由於throw了RuntimeException 則會直接執行對應的3號區域的代碼
  3. 執行5號區域的代碼
  4. 執行6好區域的代碼
    public int testFinally () {
        int a = 0 ;
        try {
        1
            throwException();
        2   return a;
        } catch (RuntimeException r) {
        3    System.out.println("RuntimeException");
        4   return a;
        } catch (Exception e) {
        5    System.out.println("Exception");
        } finally {
        6   System.out.println("finally");
        7   a=1;
        }
        return 0;
    }

    public void throwException () {
        throw new RuntimeException();
    }

執行順序如下:

  1. 1號區域代碼
  2. 3號區域代碼
  3. 4號區域代碼,但是此時不會直接返回,而是將a的值複製保存一份
  4. 6號區域代碼
  5. 7號區域代碼,但是此時已經不會影響a在第3步的值
  6. 4號區域代碼,return 結束函數 此時a=0
    public int testFinally () {
        int a = 0 ;
        try {
        1
            throwException();
        2   return a;
        } catch (RuntimeException r) {
        3    System.out.println("RuntimeException");
        4   return a;
        } catch (Exception e) {
        5    System.out.println("Exception");
        } finally {
        6   System.out.println("finally");
        7   a=1;
        8   return a;
        }
        9  System.out.println("Exception");
        10 return a;
    }

    public void throwException () {
        throw new RuntimeException();
    }

執行順序如下:

  1. 1號區域代碼
  2. 3號區域代碼
  3. 4號區域代碼,但是此時不會直接返回,而是將a的值複製保存一份
  4. 6號區域代碼
  5. 7號區域代碼,但是此時已經不會影響在第3步的要返回的值
  6. 8號區域代碼,此時a=1 此時 return a=1,結束函數
    9,10不會執行。
    這就是爲什麼一般finally不寫return。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章