0

我想重現InterruptedException的行爲的一部分,但我不明白它是如何工作...Java自定義異常

所以我有這樣的代碼:

public static void main(String [] args){ 
    try{ 
    }catch(InterruptedException ie){ 
    } 
} 

當我嘗試編譯我得到

Unreachable catch block for InterruptedException. This exception is never thrown from the try statement body 

我做了一個自定義異常這是不是一個真正的異常,因爲它沒有延伸異常......這個編譯器錯誤

class MyException extends Throwable{ 
} 
public static void main(String [] args){ 
    try{ 
    }catch(MyException ie){ 
    } 
} 

這顯示了相同的編譯器錯誤

Unreachable catch block for MyException. This exception is never thrown from the try statement body 

然後我做了這個

public static void main(String [] args){ 
    try{ 
     throw new MyException(); 
    } catch(MyException e){ 
     e.printStackTrace(); 
    } 

    try{ 
     throw new InterruptedException(); 
    } catch(InterruptedException e){ 
     e.printStackTrace(); 
    } 
} 

且二者編譯罰款。

但現在到了棘手的部分..

public static void main(String [] args){ 
    try{ 
     throw new MyException(); 
    } catch(Exception e){ 
     e.printStackTrace(); 
    } catch(MyException e){ 
     e.printStackTrace(); 
    } 

    try{ 
     throw new InterruptedException(); 
    } catch(Exception e){ 
     e.printStackTrace(); 
    } catch(InterruptedException e){ 
     e.printStackTrace(); 
    } 
} 

編譯器說

Unreachable catch block for InterruptedException. It is already handled by the catch block for Exception 

你能告訴我怎麼InterruptedException的顯示InterruptedException的了「無法到達catch塊。這個異常是永遠不會從拋嘗試聲明體「編譯器錯誤,並在同一時間擴展異常,因爲當我擴展異常我的自定義異常不顯示此編譯器錯誤

作爲一個例子:

class MyException extends Exception{} 

public static void main(String [] args){ 
    try{   
    }catch(MyException me){  
    } 
} 

此代碼不拋出任何編譯器錯誤

但下面的代碼確實

class MyException extends Throwable{} 

public static void main(String [] args){ 
    try{   
    }catch(MyException me){  
    } 
} 
+0

錯誤消息說,這一切:「這已經是由異常的catch塊處理「。根據定義,抓住每個異常的東西都會捕獲InterruptedException。 –

+0

我在問題的結尾做了一個錯誤。我想知道如何InterruptedException擴展異常,它顯示了一個編譯器錯誤,當它沒有在try體內拋出,因爲當我擴展異常我的自定義異常不會顯示此編譯器錯誤 – Mike

+0

編輯你的問題和清除mae。我不明白你的意思。 –

回答

1

這是因爲InterrupedExceptionException一個子類,但Exception是已經被前面的catch塊所捕獲。

Section 11.2.3 of the JLS狀態:

這是一個編譯時錯誤,如果catch子句可以捕獲異常E1級,並立即封閉try語句可以捕獲E1或E1的超類的前面catch子句。

InterruptedException catch塊中的塊將是無法訪問的代碼,這將是此編譯器錯誤的理由。

+0

我在問題的最後做了一個錯誤。我想知道InterruptedException是如何擴展異常的,它在try體中沒有拋出時會顯示編譯器錯誤,因爲當我擴展異常時,我的自定義異常不會顯示此編譯器錯誤 – Mike

+0

如果MyException不是'例外「,那麼沒有問題。 – rgettman

+0

我剛剛編輯了我的問題。看來我無法解釋我的問題是什麼...... :)我知道我的類沒有擴展Exception類。但是,如果我擴展Exception類,如果我的try塊是空的,我不會得到編譯器錯誤 – Mike

0

您chatching拋出異常,因此必須從某處

的方式拋出:我的編譯器顯示錯誤1腳本和第二腳本

+0

我在問題的最後做了一個錯誤。我想知道如何InterruptedException擴展異常,並顯示編譯器錯誤,當它沒有在try體內拋出,因爲當我擴展異常我的自定義異常不顯示此編譯器錯誤 – Mike