Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么Scanner使用Scanner#ioException()而不是抛出异常?_Java_Java.util.scanner_Ioexception - Fatal编程技术网

Java 为什么Scanner使用Scanner#ioException()而不是抛出异常?

Java 为什么Scanner使用Scanner#ioException()而不是抛出异常?,java,java.util.scanner,ioexception,Java,Java.util.scanner,Ioexception,这有什么好处/坏处吗 通常,从流读取时会引发异常: try { inputStream.read(); }catch(IOException e) { e.printStackTrace(); } 但是,当使用扫描仪时,您不会被迫处理异常。相反,如果抛出一个,您将使用Scanner\ioException() 我知道,Scanner不是一个流,而不是一个在需要时解析数据的标记器,但是为什么它不像其他涉及IO的操作那样处理它的异常呢?我应该在什么时候以这种方式处理异常?解释如下

这有什么好处/坏处吗

通常,从流读取时会引发异常:

try {
    inputStream.read();
}catch(IOException e) {
    e.printStackTrace();
}
但是,当使用
扫描仪时,您不会被迫处理异常。相反,如果抛出一个,您将使用
Scanner\ioException()


我知道,
Scanner
不是一个流,而不是一个在需要时解析数据的标记器,但是为什么它不像其他涉及IO的操作那样处理它的异常呢?我应该在什么时候以这种方式处理异常?

解释如下

扫描仪可以从实现可读接口的任何对象读取文本。如果底层readable的readable.read(java.nio.CharBuffer)方法的调用引发IOException,则扫描器假定已到达输入的末尾。可以通过IOException()方法检索底层可读对象引发的最新IOException

扫描仪
是较低级别I/O读卡器的较高级别使用者,并自行处理异常。如果您想要/需要,可以使用该异常。在某些构造函数之外,Scanner API的行为是定义良好的,不需要调用方捕获任何与I/O相关的异常

好处是调用方不需要编写try/catch块,也不需要让自己的方法抛出checked
IOException
类型。这是可能的,因为扫描器实现已经以不需要的方式处理了这些边缘情况

相反,如果Scanner方法抛出一个选中的异常,那么作为调用方,如果您有从异常情况中恢复的合理方法,那么您应该只编写一个
catch
块。事实上,您将被迫编写它,或者,如果您没有捕获它,现在您的类API将被“污染”,只因为实现细节(因为您碰巧使用了Scanner类)而声明其方法以抛出选中的异常

另一方面,较低级别的
可读接口及其实现无法处理异常情况,只能将异常情况扔给调用方;他们无法知道什么是“正确的”恢复手段,或者是否存在任何合适的手段。抛出检查过的异常可能是必要的,但是好的API会尽可能避免它