Scanner类中hasNext()方法的解析

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