今天测试Java代码需要用到控制台输入,这就需要Scanner类中的方法,但是对其中的hasNext()方法不是特别理解,如下是对该方法的粗浅理解。
hasNext()方法,其源代码如下:
public boolean hasNext() { ensureOpen(); saveState(); modCount++; while (!sourceClosed) { if (hasTokenInBuffer()) { return revertState(true); } readInput(); } boolean result = hasTokenInBuffer(); return revertState(result); }
执行过程:
-
这个方法调用了ensureOpen(),所以它要求确保Scanner一定是打开状态的,如果你在调用hasNext()时,Scanner已经通过close()方法关闭,它并不会从缓存中进行读取,而是抛出Scanner closed的异常;
-
然后就是对Scanner索引状态的保存,这在后面通过revertState()进行索引状态恢复时还会用到;
-
通过modCount++记录索引状态改变的次数;
-
如果源代码没有完成,则在通过hasTokenInBuffer()方法判断缓存中还有token后,则会返回true,同时通过revertState()进行索引状态恢复;
-
如果通过hasTokenInBuffer()方法判断缓存中没有token,就需要用readInput()进行数据读入到缓存;
-
如果源代码已经完成或者判断 hasTokenInBuffer()方法为false时(意味者方法还没有return结束),在这里将通过 hasTokenInBuffer()方法进行判断;
-
返回判断的布尔值的同时对索引状态进行恢复。
可以看出:
-
该方法要求你的Scanner必须为打开状态;
-
只要代码未完成,就会先从目前索引位置对缓存进行判断,如果为false,就会将新的数据读入缓存,这意味着只要代码没完成,则永远不能看返回false,直到返回true为止;
-
如果代码完成了,则才有可能返回false。