next()與nextLine()的使用注意事項

今天練習的時候遇到了這個問題,發現這個很類似於C裏邊的scanf("%s")讀取緩存區的過程。記錄一下
代碼:

package exception_use;

import java.util.Scanner;

public class Test1 {
    public static void main(String[]args){
        Scanner sc = new Scanner(System.in);
        System.out.println("---學生管理系統---\n學生錄入信息");
        String name = "";//name
        int age =  0;
        String sex="";//性別
        try{
            System.out.println("請輸入學生的姓名:");
            name = sc.nextLine();
            System.out.println("請輸入學生的年齡:");
            age = sc.nextInt();
            System.out.println("請輸入學生的性別:");
            sex = sc.nextLine();
        }catch (Exception e){
            e.printStackTrace();
            System.out.println("輸入有誤");
        }
        System.out.println("學生的姓名是"+name+"學生的年齡是"+age+"學生的性別是:"+sex);
    }
}

請注意14行和18行,我這裏使用了兩個nextLine()函數來讀取字符串。
運行結果:
輸入Amy we enter
輸入 18 enter
在這裏插入圖片描述
我們把第一個nextLine()修改爲next()

運行結果:
輸入的是 Amy enter
然後輸入 18 enter
在這裏插入圖片描述
現在把兩個nextLine修改爲next()
在這裏插入圖片描述

先來了解的函數:

  1. next()一定要讀取到有效字符後纔可以結束輸入,沒有輸入有效字符之前,忽略空格,Tab鍵,以及enter;輸入了有效字符以後,空格,Tab,enter都可以結束輸入。在讀取完後把光標放在讀取數據的同一行,該數據的後面。所以next()所以無法得到帶空格的字符串。
  2. nextLine()從第一次的結果我們可以知道它是可以支持輸入空格隔開的字符串,其實它是讀取整行的數據包括單詞間的空格,到回車結束(也就是從開始讀一整行,返回回車之前的字符),讀取結束後,光標放在下一行開頭。
  3. nextInt()只讀取整數類型數據, nextInt()在讀取完輸入後把光標放在讀取數據的同一行,該數據的後面。

java8 開發手冊:
1.string next()
在這裏插入圖片描述
2.String nextLine()
在這裏插入圖片描述
3.nextInt()
在這裏插入圖片描述

原因分析:
1.當兩個都是nextLine(第一次的結果)
輸入Amy we enter,第一個nextLine讀取到字符串Amy we;然後enter結束輸入,光標指向下一行了,這個時候輸入18 enter,nextInt讀取18,光標放在了enter前面,到nextLine()的時候,自然直接讀取了enter,返回的是空串,即sex="",結束,打印結果。

修改一下代碼驗證:
輸入Amy we enter18enter
name=Amy we;age=18;sex=“”;
在這裏插入圖片描述

2.當第一個是next(),第二個是nextLine()時(第二次結果)
輸入Amy enter,第一個next()讀取了Amy,enter結束,然後把光標放在Amy後面enter前,所以輸入了Amy;我們輸入18 enter,此時相當於有enter 18 enter 給nextInt匹配,匹配了18,光標放在了enter前面,到nextLine()的時候,自然直接讀取了enter,返回空串。結束,打印結果。

修改代碼並驗證:
輸入enter enter enter 2 enter enter entr 2enter
name=2;age=2;sex=“”;
在這裏插入圖片描述
3.兩個都改爲next()後,輸入Amy enter,那麼next()讀取到了Amy,光標放在enter,我們輸入18 enter,則nextInt匹配enter 18 enter得到18,光標放在最後的enter前面,這個時候enter不是有效的輸入,next()就會繼續等,我們輸入了wome enter,可以了,讀取women,光標放在enter結束。

驗證:
在這裏插入圖片描述

結論
當我們使用該類型的數據多次輸入時,應該自己要權衡在每一個 next()、nextDouble() 、 nextFloat()、nextInt() 等語句之後是否要加一個nextLine()語句,將被next()去掉的Enter結束符過濾掉。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章