2013-08-24 58 views
4
class Y { 
    public static void main(String[] args) throws RuntimeException{//Line 1 
     try { 
      doSomething(); 
     } 
     catch (RuntimeException e) { 
      System.out.println(e); 
     } 
    } 
    static void doSomething() throws RuntimeException{ //Line 2 
     if (Math.random() > 0.5) throw new RuntimeException(); //Line 3 
     throw new IOException();//Line 4 
    } 
} 

當我拋出兩種類型的異常(IOException異常在線路4和RuntimeException的在3號線),我發現我的程序無法編譯,直到我在拋出子句線1 &指示:「IOException異常」 2.IOException異常VS的RuntimeException的Java

鑑於如果我反轉「throws」以指示拋出IOException,程序會按如下所示成功編譯。

class Y { 
    public static void main(String[] args) throws IOException {//Line1 
     try { 
      doSomething(); 
     } 
     catch (RuntimeException e) { 
      System.out.println(e); 
     } 
    } 
    static void doSomething() throws IOException {//Line 2 
     if (Math.random() > 0.5) throw new RuntimeException();//Line 3 
     throw new IOException();//Line 4 
    } 
} 

爲什麼我總是使用「拋出」IOException,即使RuntimeException也被拋出(第3行)?

回答

11

因爲IOException是一個Checked Exception,它應該被處理或聲明爲拋出。 與此相反,RuntimeException是一個未經檢查的例外。你不需要處理或聲明它被拋出方法拋出子句(這裏我的意思是,如果你不處理未經檢查的異常,它將在語法上是正確的,編譯器不會生氣)。但是,有些情況下,您需要處理某些未經檢查的例外並採取相應措施。


相關帖子:

參考文獻:

+0

你不需要處理RuntimeException,聽起來不正確? –

+0

有一些'RuntimeException'應該被處理,即使它們不需要被捕獲/聲明。 'NumberFormatException'是一個常見的例子。 – chrylis

+1

@chrylis,**應該被處理,**需要**被處理實際上是一個很大的區別。 – svz

0

的原因是,有兩種不同的類型在這種情況下的例外。一種是checked異常,應該由程序員處理,另一種是不需要特殊處理的unchecked異常。

相關問題