2014-09-29 59 views
0

我知道輸出是什麼。但是,問題是這個問題的解釋是什麼。Java拋出異常混亂-1與示例

public class LongExp{ 
    LongExp() throws Exception{ 
    LongExp.start(); 
    } 
    public static void start()throws RuntimeException{ 
    throw new IllegalMonitorStateException(); 
    } 
    public static void main(String args[]) throws Throwable{ 
    try{ 
     try{ 
     try{ 
      new LongExp(); 
     } catch(Throwable t){ 

      System.out.println("catch(Throwable t) 1"); 
      throw t; 
     } 
     }catch(Throwable t){ 
      System.out.println("catch(Throwable t) 2"); 
     if (t instanceof IllegalMonitorStateException){ 
      System.out.println("(t instanceof IllegalMonitorStateException)"); 
      throw (RuntimeException)t; 
     }else{ 
      System.out.println("else (t instanceof IllegalMonitorStateException)"); 
      throw (IllegalMonitorStateException)t; 
     } 
     } 
    }catch(IllegalMonitorStateException e){ 

     System.out.println("a"); 
    }catch(RuntimeException e){ 

     System.out.println("b"); 
    }catch(Exception e){ 
     System.out.println("c"); 
    }catch(Throwable e){ 
     System.out.println("d"); 
    } 
    } 
} 

這是輸出

catch(Throwable t) 1 
catch(Throwable t) 2 
(t instanceof IllegalMonitorStateException) 
a 

我解釋什麼都正在被類型轉換傳播, 這是引用的就在變化,但不是實例類型的異常物體。 這就是爲什麼在最後它抓住了IllegalMonitorStateException。

我正確嗎?

編輯:TYPOS;

回答

1

是的,它是運行時多態,可以將子類的對象分配給父類的引用類型。

這裏您將IllegalMonitorStateException分配給包含IllegalMonitorStateException(子類)實例的不同父類(Throwable,RuntimeException)。

The reason why you have got the IllegalMonitorStateException at the end is,it was the originally propagated object,and according to the exception handling rule,it will be caught by most specific catch block first than generic one

0

是的,回答你的問題。

而且,爲什麼

,因爲我們總是可以指定你的情況父類的子類參考IllegalMonitorStateException。此外,當我們重新拋出一個異常時,比如說E1 - 即使被更高層次中的catch塊捕獲,關於這個E1的所有內容都會被預先保存。

您可以通過在外部catch塊中打印堆棧跟蹤來驗證此情況。例如,

class Exception1 { 

    Exception1() throws Exception{ 
    Exception1.start(); 
    } 
    public static void start()throws RuntimeException{ 
    throw new IllegalMonitorStateException(); 
    } 
    public static void main(String args[]) throws Throwable{ 
    try{ 
     try{ 
     try{ 
      new Exception1(); 
     } catch(Throwable t){ 
      t.printStackTrace(); 
      throw t; 
     } 
     } catch(Throwable t){ 
      t.printStackTrace(); 
      throw t; 
     } 
    } catch(IllegalMonitorStateException e){ 
     e.printStackTrace(); 
    } 
    } 
} 

所有三個堆棧將打印相同的說明。