现在你已经提到它,它非常含糊。虽然,解释它将意味着深入实施细节。
Scanner
主要依赖于基础流。 Scanner#next()
将抛出一个NoSuchElementException
每当底层流的read()
方法在阅读返回-1
:
(执行概要)
public void next() {
if(needInput)
readInput();
else
throwException();
}
void readInput() {
int n = 0;
try {
n = underlyingStream.read(buf);
} catch (IOException ioe) {
lastException = ioe;
n = -1; //error happened
}
if (n == -1)
underlyingStreamClosed = true;
}
void throwException() {
if (underlyingStreamClosed)
throw new NoSuchElementException();
else
throw new InputMismatchException();
}
例如,让我们看看InputStream
没有扫描仪。 InputStream#read()
块时,它被称为,直到数据的用武之地。使用一个InputStream
如System.in
会导致您的Scanner
阻止,因为InputStream#read()
块(实现本机代码编写,所以如果你真的感兴趣,你可以找到它位于的文件并自己查看implmenetation)。这适用于延伸InputStream
的任何流,但不会覆盖read()
以更改其实施。例如,ObjectOutputStream
,DataOutputStream
FileInputStream
,但是,确实会覆盖read()
(也有本地实现)。调用FileInputStream#read()
将返回-1
当您尝试阅读,但没有什么(虽然文档确实说这种方法可能会阻止,我还没有碰到的情况下)。这纯粹是由于你实际上不应该担心的FileInputStream#read()
的实现。
长话短说:它依赖于基础流。熟悉你的流,你就会被设置。我看到它的方式,如果你真的担心哪些数据流阻塞,看看实现(我发现当的子类不是覆盖read()
方法,他们倾向于阻止),自己测试它们,或看在线。文档应该可能告诉你,虽然就像我说的,我还没有碰到过FileInputStream#read()
被阻止的时刻(有人可以帮助我重现这种情况,如果确实如文档所述的那样)
这是否意味着,如果从System.in读取,'NoSuchElementException'永远不会被抛出,就好像标准输入是空的那么扫描器将永远阻塞? – LogicChains 2014-11-01 05:32:43
我不完全确定你的意思。请详细说明; “*如果从System.in读取,将永远不会抛出异常*”令我困惑 – 2014-11-01 05:37:14
这应该是'NoSuchElementException永远不会被抛出'。如果没有更多的标记可用,Scanner.next()会抛出一个NoSuchElementException异常,但是如果它阻塞,则意味着它会等待标记可用,因此不会抛出NoSuchElementException异常。 – LogicChains 2014-11-01 05:45:35