2017-04-11 89 views
-1

免責聲明:我沒有訪問java編譯器也不能安裝IDE,我的工作空間不給我足夠的權限。是否明確拋出異常向上拋出?

我試圖理解Java是如何處理異常交易和偶然發現了這個問題:

如果子類明確地拋出捕獲所有異常的catch塊中的例外,它是泛起?例如,考慮下面的代碼行:

public Class someClass { 
    public int value; 
    public someClass() { 
     value = 1; 
     try { 
      value ++; 
      if(value == 2) { 
       throw new Exception("value is 2"); 
      } 
     } catch (exception e) { 
      System.out.println("I caught an exception."); 
      throw new Exception("Does this exception get thrown upwards?"); 
      System.out.println("will this line of code get printed after the previously thrown exception?"); 
     } finally { 
      return; 
     } 
    } 
} 

public class anotherClass { 
    public static void main throws Exception{ 
     someClass someclass = new someClass(); // will this class catch the second explicitly thrown exception? 
    } 
} 

因此,一個新的異常是在try塊拋出,通過下面的catch塊捕獲。第二個投擲陳述去哪裏?如果有的話,它會進入調用類嗎?另外,println語句會在引發異常後執行,即使它不在finally塊中?

謝謝。

+3

您已擁有該代碼。你爲什麼不跑它看看會發生什麼? –

+0

是的,第二個冒泡並且拋出後的'println'語句不會被執行。一個好的IDE將顯示第二個'println'作爲不可達代碼。嘗試Eclipse和FindBugs插件。 –

+0

@ThomasWeller我目前的工作電腦沒有Java,我沒有安裝Java的權限,我也不能聯繫管理員。 – noobcoder

回答

1

第二個throw語句在哪裏呢?如果有的話,它會向上進入 呼叫班嗎?

是的,例外情況將拋出給調用方法,在你的情況下,它是main()方法。

即使它不在finally塊中,println語句在拋出異常後會被執行 ?

是,System.out.println("I caught an exception.")將被執行,然後該異常對象將被拋出給調用者(即,main()),所以在catch塊,下面的線不可達。

System.out.println("will this line of code get 
       printed after the previously thrown exception?"); 

重要的一點是,你可以隨時使用exception.printStackTrace()(在catch塊內)檢查如何異常已經越過方法堆棧傳播。我建議你嘗試一下,這樣你就可以清楚地看到異常是如何在方法中傳播的。

我建議你參考here並清楚地瞭解方法鏈如何執行。

此外,另一點是,你可能會感興趣的是,當main()方法拋出異常(即,main()本身或通過鏈條,無論是這種情況),那麼JVM可以捕獲該異常,並關閉

+0

謝謝你的洞察! – noobcoder

1

雖然可能不是預期,除了將可以在特定情況下,您也可以通過在someClass構造失蹤throws條款看泛起。

原因是finally塊中的return語句,導致java拋棄異常(以及一個好的IDE給你一個「finally塊不能正常完成」的警告)。

更具體地,section 14.20.2 of the specification指出:

如果catch塊爲原因 - [R突然結束,然後執行最後 塊。然後有一個選擇:

  • 如果如果finally塊的原因小號突然完成了finally塊正常完成,則try語句的原因突然完成R.

  • ,那麼try語句完成突然出於原因S(並且理由R被丟棄)。

隨着原因小號作爲return聲明和原因[R作爲throw new Exception("Does this exception get thrown upwards?");

您可以看到自己on ideone.com

class someClass { 
    public int value; 

    public someClass() { 
     value = 1; 
     try { 
      value++; 
      if (value == 2) { 
       throw new Exception("value is 2"); 
      } 
     } catch (Exception e) { 
      System.out.println("I caught an exception."); 
      throw new Exception("Does this exception get thrown upwards?"); 
     } finally { 
      return; 
     } 
    } 
} 

class anotherClass { 
    public static void main(String[] args) { 
     try { 
      someClass someclass = new someClass(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

輸出:

I caught an exception. 

但對於這個問題的目的,javaguy的答案已經覆蓋了普遍的觀點不夠好。