• 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。
  • 相关阅读:
    利用for循环 修改精灵图背景位置
    添加列表项 避免浏览器反复渲染 Fragment
    向元素添加属性名和属性值
    分割文本节点
    查询、回显 基本功能
    获取注释
    合并文本节点
    Node(节点)的4个操作方法
    setTimeout与setInterval
    javascript循环
  • 原文地址:https://www.cnblogs.com/mryx/p/15620531.html
Copyright © 2020-2023  润新知