亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

嘗試捕獲最終返回的澄清

嘗試捕獲最終返回的澄清

慕森王 2019-11-26 12:59:12
通過閱讀本論壇中與上述主題相關的所有問題(請參見標題),我完全理解finally總是會調用該問題。(System.exit和無限循環除外)。但是,我想知道是否return在catch塊中調用了a,然后return從finally塊中調用了另一個。例如:public static void main(String[]args) {    int a = new TestClass().absorbeTheValue();}int absorbeTheValue() {    try {        int a = 10/0;        if (a > 0) return 4;    } catch(Exception e) {        return 45;    } finally {        return 34;    }}    因此,無論如何,這里的輸出(調用該方法時)將為34。這意味著最終總會運行。我認為盡管其他“返回”根本沒有執行。在許多帖子中,我發現一個事實,那就是最終將內容覆蓋在catch子句return已經編寫的內容之上。我的理解是,一旦將要對catch子句中的返回值進行評估,控制流便會傳遞到finally子句,該子句又具有另一個返回值,這次將對返回值進行評估,而不會將控制權傳遞回catch子句。這樣,return在運行時唯一調用的將是final返回。你同意嗎?甲return在finally不傳遞回控制到程序但返回值,并結束方法。我們可以這樣說嗎?
查看完整描述

3 回答

?
尚方寶劍之說

TA貢獻1788條經驗 獲得超4個贊

如果到達return了該try塊中的in ,它將控制權轉移到該finally塊,該函數最終將正常返回(不是拋出)。


如果發生異常,但是代碼return從該catch塊到達a ,則控制權轉移到該finally塊,并且該函數最終正常返回(不是拋出)。


在你的榜樣,你有return在finally,所以不管發生什么情況,該函數將返回34,因為finally有最后的(如果你愿意)字。


盡管您的示例中未涉及,但即使您沒有,catch并且如果在try塊中引發了異常且未捕獲到異常,這也將是正確的。通過return從finally塊執行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;

    }

  }

}

如果您在不提供任何參數的情況下運行它:


$ java最終返回

...中的代碼foo引發ArrayIndexOutOfBoundsException。但是因為該finally塊執行a return,所以該異常得到抑制。


這就是為什么最好避免使用returnin的原因之一finally。


查看完整回答
反對 回復 2019-11-26
?
海綿寶寶撒

TA貢獻1809條經驗 獲得超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"; 

        }

    }

}

結果是:


try

catch

finally

return in finally


查看完整回答
反對 回復 2019-11-26
?
慕姐8265434

TA貢獻1813條經驗 獲得超2個贊

一個塊中的returncatch將“正?!蓖瓿桑皇恰巴蝗弧蓖瓿?。從第11節中可以很明顯地看出這一點:“在引發異常的過程中,Java虛擬機突然一個一個地完成了所有已經開始但尚未完成的表達式,語句,方法和構造函數調用,初始化程序以及字段初始化表達式。在當前線程中執行?!?/em>

查看完整回答
反對 回復 2019-11-26
  • 3 回答
  • 0 關注
  • 407 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號