1. 程式人生 > 其它 >Scanner類中hasNext()方法的解析

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。