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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM