2016-12-31 109 views
-2

在java中編寫代碼時,我看到了一件奇怪的事情發生。catch塊中的返回語句

而代碼是這樣寫的。

class lara { 
    public static void main(String ...pro) { 
     int o; 
     try{ 
      o=999; 
     }catch(Exception mu) { 
     System.out.println("sololobo"); 
     } 
    System.out.println(o); 
} 
} 

它將在其中被請求ø要打印

線顯示錯誤

「的System.out.println(○);」

但是,當我添加類型「返回;」捕捉塊內的聲明像

class lara { 
    public static void main(String ...pro) { 
     int o; 
     try{ 
      o=999; 
     }catch(Exception mu){ 
      System.out.println("sololobo"); 
      return; 
     } 
    System.out.println(o); 
    } 
} 

它完美的工作。
這是爲什麼發生的?
是追趕功能嗎?
這個return語句引用了什麼函數。
謝謝你!

+2

請花些時間將代碼格式化得更清晰,並帶有適當的縮進和換行符。如果你使用IDE,它可能會幫助你。這並沒有幫助你沒有告訴我們錯誤是什麼,或者... –

+0

當你添加一個return語句時,它會在你的情況下返回'main'函數,所以之後的代碼很簡單,不可訪問。 – MDaniyal

回答

1

發生第一個錯誤的原因是int變量o在發生異常時可能無法初始化。在更新後的版本與return,也不會發生這樣的問題:

public static void main(String ...pro) { 
    int o; 
    try { 
     o = 999; 
    } catch(Exception mu) { 
     System.out.println("sololobo"); 
     return; // end the call to `main()` here 
    } 

    // now the following line can only be reached if the try 
    // completes without error, which means that o will be defined 
    System.out.println(o); 
} 
+0

很好的解釋。基本上,變量「o」需要被初始化。只要你在Try語句之前或者在Catch-Block內初始化它,代碼就可以工作。只要確保「o」已初始化。 Java中的聲明是不夠的。 – diaco

1

沒有return你永遠到達System.out.println(o);聲明。編譯器不知道在try catch發生錯誤的位置,因此它不知道它是否已經被正確初始化或不是o

如果您在catch塊的System.out.println(o);將不會以任何異常,這意味着如果代碼達到的情況下,可以達到迴歸,沒有例外,這反過來又意味着,o已經正確組。

+0

是的,但它仍然打印任何它已被分配內部嘗試塊..爲什麼... {是不是應該在本地分配......即,能夠在try塊內調用時獲得它的值,但在塊外調用時無法獲得它的值;} –

+0

@his_dogeness沒有本地賦值這樣的事情。它有**一個**值,就是這樣。 – luk2302

+0

aha我有點得到它...謝謝.. ..新的編程,試圖從邏輯上解除它..我猜java不像C++那麼合理 –