2014-12-03 108 views
2

這是否有任何優點/缺點?爲什麼Scanner使用Scanner#ioException()而不是拋出異常?

try { 
    inputStream.read(); 
}catch(IOException e) { 
    e.printStackTrace(); 
} 

但使用Scanner時,你不會被強迫來處理異常:

通常情況下,你會從一個流讀取時拋出異常。相反,如果有人被拋出,你會使用Scanner#ioException()

我知道Scanner不是一個流,而是一個需要時解析數據的標記器,但是爲什麼它處理異常與涉及IO的其他操作不同?我應該什麼時候以這種方式處理異常?

回答

5

解釋由class documentation for java.util.Scanner給出。

掃描儀可以從任何實現可讀接口的對象中讀取文本。如果對基礎可讀的Readable.read(java.nio.CharBuffer)方法的調用引發IOException,則掃描器會假定已到達輸入的末尾。可以通過ioException()方法檢索基礎可讀的最近拋出的IOException。

Scanner是較低級別的I/O讀取器的更高級別的使用者,並自行處理異常。 ioException() method如果您想要/需要,則可以使用該例外。在某些構造函數之外,Scanner API的行爲定義良好,無需調用方捕獲任何與I/O相關的異常。

好處是,調用者不需要寫try/catch塊或者使自己的方法拋出檢查IOException類型。這是可能的,因爲掃描器實施已經以不需要exceptions as flow control的方式處理這些邊緣案例。

如果代替Scanner方法拋出一個檢查異常,如果你有一個合理的方法從異常情況下恢復,你作爲調用者應該只寫一個catch塊。事實上,你會被迫寫它,或者如果你沒有抓住它,現在 API變成「污染」,宣佈其方法拋出checked異常僅僅因爲實現細節的(因爲你碰巧使用掃描儀類)。

另一方面,較低級別的Readable接口及其實現無法處理異常情況,並且強迫將它們丟給調用者;他們無法知道什麼是「正確的」恢復方式,或者是否存在任何適當的手段。檢查異常可能是必要的,但良好的API將盡可能地避免它。

相關問題