1. 程式人生 > 實用技巧 >next() VS nextLine() VS hasNext()

next() VS nextLine() VS hasNext()

1. next() VS nextLine()

1.1 對比

組1

組2

next()/nextDouble()/nextFloat() /nextInt()/nextLine()

nextLine ()

只返回非空字元,且不接收一切空字元

接收Enter鍵之前的所有字元, 即可以得到帶blank或tab的字串

對blank/tab/enter的處理

前導: 不予接收

後導: 視為輸入的結束符, 且不予接收,而是全部留在輸入流的緩衝區,被傳遞給後繼的各種next方法

一律接收

結束方法

  1. 輸入了非空字元
  2. ENTER
  3. ENTER

結束方法的cursor

保持在本row

下移一row

非空字元: 非blank/ tab/ enter 的字元

空字元:blank/ tab/ enter

1.2 相互干擾

  1)nextLine()之間,or組1之間,無干擾

  2)nextLine()在組1之前,無干擾

  3)組1在nextLine()之前,有干擾-->組1結束方法的enter,因為留在了buffer區,所以會被後面的nextLine()接收,從而導致nextLine()直接結束

1.2.1 干擾演示

Scanner sc = new Scanner(System.in);
System.out.println("next():-" + sc.next() + "-");
System.out.println("nextLine():-" + sc.nextLine() + "-");
-----------------------------------------------------------------
"_-a_-"                   //注: "_"代表blank, "-"代表tab
next():=a= //空字元不接受, 只接收非空字元 nextLine():= = //上句的後導字元blank、tab、enter, 被本句接收, 其中enter導致本句的nextLine()方法結束. "_-a_b_-" //注: "_"代表blank, "-"代表tab next():=a= //空字元不接受, 只接收非空字元 nextLine():= b = //上句的a後的首個空字元標識著輸入結束, 並自其開始向後至enter, 都留存在buffer, 並被本句接收,其中enter導致本句的nextLine()方法結束.

1.2.2 干擾的解決

在組1後, nextLine()前, 增加一個nextLine(), 以接收組1留在buffer中的空字元

Scanner sc = new Scanner(System.in);
System.out.println("next():-" + sc.next() + "-");
sc.nextLine(); //增加以消除前句留在buffer中的enter
System.out.println("nextLine():-" + sc.nextLine() + "-");

2. hasNext()

hasNext()方法判斷輸入(檔案、字串、鍵盤等輸入流)是否還有下一個輸入項(token). 若有,返回true,反之false。

2.1 hasNext()的block

在非空字元輸入前, hasNext()一直處於wait中以等待鍵盤輸入, 進而block程式的繼續執行. 

Scanner sc = new Scanner(System.in);
System.out.println("input please");  //提示輸入. 如果不輸入非空字元, 則下面的,sc.hasNext()一直處於等待的block中
System.out.println(sc.hasNext()); //在輸入了非空字元 a 並enter後, sc.hasNext()執行完畢, 並列印判斷結果 true
----------------------------------------------
input please
a
true

2.2 sc.hasNext()阻塞loop的退出Scanner sc = new Scanner(System.in);

//下面的loop, 會無法退出. 因為: 1)如果不輸入非空字元, hasNext()一直會一直block導致無法返回boolean值供while做判斷. 2)如果輸入了非空字元, 那麼必然返回true, 陷入死迴圈. 因此, loop無法跳出.
while (sc.hasNext()) {
    System.out.println("Input from keyboard:" + sc.next());
}

3. hasNext(String patten)

可以設定一個非空字元作為終止符,如果下一個輸入與從終止符相匹配,則返回 true。掃描器不執行任何輸入。

Scanner sc = new Scanner(System.in);
while (!sc.hasNext("###")) { // 終止符為 ###. 當輸入###時, 或者"前導空字元###後導空字元"(如" ### "), !sc.hasNext("###")都返回true, 從而結束loop
System.out.println("Input from keyboard:" + sc.next()); }

3.1 !sc.hasNext("空字元") 阻塞loop的退出

Scanner sc = new Scanner(System.in);
//如果判斷的物件不是非空字元, 則也會因hasNext()只能讀取非空字元而導致hasNext()一直處於block.
while (!sc.hasNext("\r")) { 
    System.out.println("Input from keyboard:" + sc.next());
}