2014-12-03 77 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将尽可能地避免它。

相关问题