Java Scanner對象中hasNext()與next()方法的使用
Scanner對象中hasNext()與next()方法
相信很多像我一樣在剛剛接觸Java的時候都有遇到這樣的問題:
我們可能希望的是:先輸出“請輸入:”然後我們就可以在控制臺輸入一個字符串或數字。
但是,事實卻是:控制臺要我們先輸入,輸入後才顯示“請輸入:”。
這是怎麼回事?
原因:
首先,sc.hasNext()和sc.next()都可以用來輸入
我們,可以發現,hasNext()返回的是boolean類型而next()返回的是你輸入的那個值,
sc.hasNext()可以理解為把我們輸入的值存到瞭sc當中而sc.next()可以理解為從sc中取值,取值後將標識符後移(可以理解為:取完值後這個值就不在瞭),如果sc中沒有值瞭,它也會要求輸入一個值(前面說瞭它們兩都可以輸入)。
然後我們再來分析一下開始的那段程序:
首先,進入while循環,sc.hasNext()就要求我們給他輸入一個值,所以就不會輸出“請輸入:”,當我們輸完後,String str = sc.next()中,會從sc中取出我們輸入的那個值返回到str中,如果沒有值,它就會被阻塞要求我們給它一個值。
輸入hasNext()和hasNextLine()方法的區別
最近在學習在牛客網上面做一些算法練習題.
發現在一些情況下寫好的Java代碼在本機運行時正常的結果,
但是就是無法通過牛客網的測試用例。
經過檢查,最終定位到讀取測試用例的位置上,發現:
Scanner scanner = new Scanner(System.in); // 當使用 hasNextLine 方法實現判斷是否還有數據時 // 會報錯 while(scanner.hasNextLine()){ // TODO:implement code } // 當將 hasNextLine 修改為 hasNext() 方法時 // 程序恢復正常 while(scanner.hasNext()){ // TODO:implement code }
通過在網上搜索,獲取到這兩種方法的區別:
在檢查輸入流時:
hasNext()
方法會判斷接下來是否有非空字符.如果有,則返回true,否則返回falsehasNextLine()
方法會根據行匹配模式去判斷接下來是否有一行(包括空行),如果有,則返回true,否則返回false
比如當前我們有如下測試用例:
7 15 9 5
這個測試用例在牛客網上是以文件的形式進行存儲的.
而在 linux 系統中文件的結尾會有一個換行符\n,也就是說從System.in輸入流中真正讀取到的數據流是這樣的:
7 15 9 5\n
程序在處理完5之後,輸入流中就隻剩下一個換行符\n瞭,在處理完5之後while再去進行循環判斷,此時hasNext()方法和hasNextLine()方法去判斷得到的結果就產生瞭差異.
hasNext()
方法會認為之後再沒有非空字符,會返回一個falsehasNextLine()
方法會認為換行符\n是一個空行,符合行的匹配模式,則會返回一個true,但實際上由於之後再沒有數據瞭,所以會在讀取輸入流的時候發生異常,從而導致整個運行報錯.
建議方案
采用hasNextXxxx() 的話,後面也要用nextXxxx():
比如前面用hasNextLine(),那麼後面要用 nextLine() 來處理輸入;
後面用 nextInt() 方法的話,那麼前面要使用 hasNext()方法去判斷.
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Java Scanner的使用和hasNextXXX()的用法說明
- 新手初學Java流程控制
- Java在算法題中的輸入問題實例詳解
- 在Java中Scanner的用法總結
- Java控制臺輸入scanner的方法及代碼詳解