2014-02-24 101 views
1

我從遊戲書中得到這段代碼。作者解釋說它會打開音樂文件爲什麼拋出RuntimeException錯誤而不是IOException消息?

public Music newMusic(String filename) { 
    try { 
     AssetFileDescriptor assetDescriptor = assets.openFd(filename); 
     return new AndroidMusic(assetDescriptor); 
    } catch (IOException e) { 
     throw new RuntimeException("Couldn't load music '" + filename + "'"); 
    } 
} 

方法AssetFileDescriptor.openFd(filename) throws a IOException

我的問題是:爲什麼我們需要拋出RuntimeException而不是IOException消息?

+0

我可以看到的主要缺點是,由於IOException是一個檢查異常,並且由於該方法沒有處理它,所以方法頭必須有'throws IOException'。 – saiarcot895

+0

指出的原因是IOException的使用會使「調用代碼相當混亂」。我不明白 –

回答

3

IOException是一個檢查的異常,必須由任何拋出它的方法聲明。 RuntimeException未被選中,可以從任何方法中拋出。

如在示例代碼中一樣,在RuntimeException中封裝已檢查的異常通常是在檢查的異常無法從本地恢復的情況下完成的,並且它被認爲可以接受導致程序失敗的異常。一旦檢查的異常被包裝在RuntimeException中,那麼RuntimeException可以隨時向上傳播堆棧(如果發生的話),無論異常聲明是否存在。

+0

儘管它比可恢復性要好得多。 –

0

因此,您不需要將調用方法聲明爲捕獲或拋出IOException

檢查異常可能在某些情況下很好,但不是在任何地方。

+0

可能解釋Checked和Unchecked異常之間的區別也很有趣。 – Trein

+0

我知道。但作者解釋說,即使對於IOException使用try-catch,也可以將其重新拋出爲RuntimeException。指出的原因是IOException的使用會使「調用代碼相當混亂」。我不明白這一點。 –

+0

@HellonCanellaMachado聲明異常被拋出並且被捕到很嘈雜;它會減少代碼實際執行的操作。請注意,大多數其他語言甚至不*檢查異常;有些人認爲這是一個失敗的實驗。有很多情況下,檢查異常的語法開銷是不值得的。 –

相關問題