Scanner類中hasNext()方法的解析
阿新 • • 發佈:2021-11-29
今天測試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。