關于Scanner中nextInt()、nextLine()等方法總結與問題解決
Scanner.next?() 方法介紹
Scanner.next?() 有很多種方法,具體名稱與內容可以見下表格:
關于Scanner.next?() 的輸入問題與分析
讓我們先來用代碼直觀地感受一下使用scanner時經常出現(xiàn)的問題:
Scanner scanner = new Scanner(System.in); System.out.printf("請輸入你的名字: "); String name = scanner.nextLine(); System.out.printf("請輸入你的出生年份 : "); int age = scanner.nextInt(); System.out.printf("請輸入你喜歡的花 : "); String nan = scanner.nextLine(); System.out.printf( "你的名字是: " +name+ "%n 你的出生年份是 :" +age+ "%n 你喜歡的花是 :" +nan );
乍一看,沒有什么問題,就是三個簡單的輸入與讀取。但是讓我們來看看結果輸出:
請輸入你的名字: asd
請輸入你的出生年份 12
請輸入你喜歡的花 : 你的名字是: asd
你的出生年份是 :12
你喜歡的花是 :
Process finished with exit code 0
很明顯,最后一個在還沒有來得及輸入的情況下,直接執(zhí)行了輸出程序,然后結束了整個程序。
這是為什么呢?
這就涉及到上邊表格中提到的Scanner.next?()方法結束接收條件。我們在重復使用Scanner的時候,其實是在向同一個緩存區(qū)內輸入數(shù)據(jù),而所謂結束接收條件其實就是不同的“斷句符號”。讓我們來快速地看一個例子與圖解加深一下理解。
Scanner scanner = new Scanner(System.in); String name = scanner.nextLine(); String age = scanner.nextLine(); String nan = scanner.nextLine(); System.out.printf( "name: " +name+ "%n age: " +age+ "%n nan: " +nan );
結果輸出:
12
23
21
name: 12
age: 23
nan: 21
Process finished with exit code 0
此時緩存區(qū)里內容是:12\n23\n21\n 。而這三個數(shù)字為什么會被精準的分配到變量name、age、nan中呢?就是因為scanner.nextLine();函數(shù)的結束接收條件為\n。這個函數(shù)可以在接收到鍵盤輸出\n后停止接收,運行下一個程序。而\n正是我們在日常程序中進入下一個輸入時按的回車。
同理可得,上面那個程序如果正常輸入的話,緩存區(qū)里的內容是:asd\n12\nCornflower\n 。那么問題出現(xiàn)了,在第二個程序中我們用的都是scanner.nextLine(); ,他會根據(jù)\n的位置完整地讀取每一份數(shù)據(jù)并賦值給對應變量。而現(xiàn)在,我們用的分別是scanner.nextLine(); 、 scanner.nextInt(); 、 scanner.nextLine(); ,他們的結束接收條件分別為 \n 、數(shù)值、\n 。
此時三個函數(shù)就會將數(shù)據(jù)讀成這樣:
很明顯第二個scanner.nextInt()在遇到數(shù)值12后就已經結束接收,而就在我按下“進行下一個輸入”的回車時,直接結束了第三個 scanner.nextLine();的接收。
因此這就是為什么會出現(xiàn)后面的數(shù)據(jù)還沒有來得及輸入,程序就已經結束的情況。
解決方法
那有沒有解決辦法呢?
肯定的好吧
方法很簡單,就是在第二個和第三個方法之間加簡單的 scanner.nextLine(); 方法 。這樣那個被錯誤地結束第三個方法接收的“\n”,就被其他方法替代了。而第三個scanner.nextLine();也就可以正常接收數(shù)據(jù)了。
這是加上scanner.nextLine();后的緩存區(qū)讀取情況:
這是加上scanner.nextLine();后程序以及運行結果:
Scanner scanner = new Scanner(System.in); System.out.printf("請輸入你的名字: "); String name = scanner.nextLine(); System.out.printf("請輸入你的出生年份 "); int age = scanner.nextInt(); scanner.nextLine(); //加的 System.out.printf("請輸入你喜歡的花 : "); String nan = scanner.nextLine(); System.out.printf( "你的名字是: " +name+ "%n 你的出生年份是 :" +age+ "%n 你喜歡的花是 :" +nan );
請輸入你的名字: asd
請輸入你的出生年份 12
請輸入你喜歡的花 : Cornflower
你的名字是: asd
你的出生年份是 :12
你喜歡的花是 :Cornflower
Process finished with exit code 0
這回就很愉快地輸入并輸出啦!
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
springboot將mybatis升級為mybatis-plus的實現(xiàn)
之前項目工程用的是mybatis,現(xiàn)在需要將其替換為mybatis-plus,本文主要介紹了springboot將mybatis升級為mybatis-plus的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2023-09-09基于spring@aspect注解的aop實現(xiàn)過程代碼實例
這篇文章主要介紹了基于spring@aspect注解的aop實現(xiàn)過程代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-03-03解決SpringBoot運行報錯:找不到或無法加載主類的問題
這篇文章主要介紹了解決SpringBoot運行報錯:找不到或無法加載主類的問題,具有很好的參考價值,對大家的學習或工作有一定的參考價值,需要的朋友可以參考下2023-09-09SpringBoot整合騰訊云COS對象存儲實現(xiàn)文件上傳的示例代碼
本文主要介紹了SpringBoot整合騰訊云COS對象存儲實現(xiàn)文件上傳的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12java(jdk)環(huán)境變量配置(XP、win7、win8)圖文教程詳解
對于初學java的同學來說,第一件事不是寫hello world,而是搭建好java開發(fā)環(huán)境,下載jdk,安裝,配置環(huán)境變量。這些操作在xp、win7、win8不同的操作系統(tǒng)里面配置不太一樣,下面通過本文給大家介紹如何在上面不同操作系統(tǒng)下配置2017-03-03