今天測試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。