2

爲什麼第2行在第3行沒有編譯? spit()拋出一個已經被第1行捕獲到的HurtException,因此之後出現的任何檢查的異常都應該無法訪問。如果我刪除第2行,第3行將保持可到達狀態。異常不會免除編譯時檢查。在此先感謝爲我澄清這一點。具有多個捕獲語句的無法訪問的代碼

public class Ape { 
    public void run() { 
     try { 
      spit(); 
     } catch (HurtException e) { //line 1 
      System.out.println("f"); 
     } catch (LimpException ex) { //line 2: Unreachable, HurtException already caught 
      System.out.println("e"); 
     } catch (Exception ee) {  //line 3: Compiles, why? 
      System.out.println("r"); 
     } 
    } 

    public static void main(String[] args) { 
     new Ape().run(); 
    } 

    public void spit() throws HurtException { 
     throw new HurtException(); 
    } 

    class LimpException extends Exception { 
    } 

    class HurtException extends LimpException { 
    } 
} 

回答

3

編譯器只是「知道」 HurtException,可以從spit()因爲你拋出明確地定義了這一點。添加LimpException你的方法簽名的throws部分應滿足編譯器:

public void spit() throws HurtException, LimpException { 
    throw new HurtException(); 
} 

無論如何,如果該方法並沒有真正扔掉LimpException本身,你基本上只是使你的代碼難以閱讀。

2

線3編譯,因爲Exception是所有RuntimeExceptions類的超類,並且如果這樣被拋出,它會與​​塊的本體進行處理(在運行時)。

編譯器不能確定這種異常將在運行時被拋出,因此,不將其標記爲可達