Java Scanner對(duì)象中hasNext()與next()方法的使用
Scanner對(duì)象中hasNext()與next()方法
相信很多像我一樣在剛剛接觸Java的時(shí)候都有遇到這樣的問(wèn)題:
我們可能希望的是:先輸出“請(qǐng)輸入:”然后我們就可以在控制臺(tái)輸入一個(gè)字符串或數(shù)字。
但是,事實(shí)卻是:控制臺(tái)要我們先輸入,輸入后才顯示“請(qǐng)輸入:”。
這是怎么回事?
原因:
首先,sc.hasNext()和sc.next()都可以用來(lái)輸入
我們,可以發(fā)現(xiàn),hasNext()返回的是boolean類型而next()返回的是你輸入的那個(gè)值,
sc.hasNext()可以理解為把我們輸入的值存到了sc當(dāng)中而sc.next()可以理解為從sc中取值,取值后將標(biāo)識(shí)符后移(可以理解為:取完值后這個(gè)值就不在了),如果sc中沒(méi)有值了,它也會(huì)要求輸入一個(gè)值(前面說(shuō)了它們兩都可以輸入)。
然后我們?cè)賮?lái)分析一下開(kāi)始的那段程序:
首先,進(jìn)入while循環(huán),sc.hasNext()就要求我們給他輸入一個(gè)值,所以就不會(huì)輸出“請(qǐng)輸入:”,當(dāng)我們輸完后,String str = sc.next()中,會(huì)從sc中取出我們輸入的那個(gè)值返回到str中,如果沒(méi)有值,它就會(huì)被阻塞要求我們給它一個(gè)值。
輸入hasNext()和hasNextLine()方法的區(qū)別
最近在學(xué)習(xí)在??途W(wǎng)上面做一些算法練習(xí)題.
發(fā)現(xiàn)在一些情況下寫好的Java代碼在本機(jī)運(yùn)行時(shí)正常的結(jié)果,
但是就是無(wú)法通過(guò)牛客網(wǎng)的測(cè)試用例。
經(jīng)過(guò)檢查,最終定位到讀取測(cè)試用例的位置上,發(fā)現(xiàn):
Scanner scanner = new Scanner(System.in); // 當(dāng)使用 hasNextLine 方法實(shí)現(xiàn)判斷是否還有數(shù)據(jù)時(shí) // 會(huì)報(bào)錯(cuò) while(scanner.hasNextLine()){ // TODO:implement code } // 當(dāng)將 hasNextLine 修改為 hasNext() 方法時(shí) // 程序恢復(fù)正常 while(scanner.hasNext()){ // TODO:implement code }
通過(guò)在網(wǎng)上搜索,獲取到這兩種方法的區(qū)別:
在檢查輸入流時(shí):
hasNext()
方法會(huì)判斷接下來(lái)是否有非空字符.如果有,則返回true,否則返回falsehasNextLine()
方法會(huì)根據(jù)行匹配模式去判斷接下來(lái)是否有一行(包括空行),如果有,則返回true,否則返回false
比如當(dāng)前我們有如下測(cè)試用例:
7 15 9 5
這個(gè)測(cè)試用例在??途W(wǎng)上是以文件的形式進(jìn)行存儲(chǔ)的.
而在 linux 系統(tǒng)中文件的結(jié)尾會(huì)有一個(gè)換行符\n,也就是說(shuō)從System.in輸入流中真正讀取到的數(shù)據(jù)流是這樣的:
7 15 9 5\n
程序在處理完5之后,輸入流中就只剩下一個(gè)換行符\n了,在處理完5之后while再去進(jìn)行循環(huán)判斷,此時(shí)hasNext()方法和hasNextLine()方法去判斷得到的結(jié)果就產(chǎn)生了差異.
hasNext()
方法會(huì)認(rèn)為之后再?zèng)]有非空字符,會(huì)返回一個(gè)falsehasNextLine()
方法會(huì)認(rèn)為換行符\n是一個(gè)空行,符合行的匹配模式,則會(huì)返回一個(gè)true,但實(shí)際上由于之后再?zèng)]有數(shù)據(jù)了,所以會(huì)在讀取輸入流的時(shí)候發(fā)生異常,從而導(dǎo)致整個(gè)運(yùn)行報(bào)錯(cuò).
建議方案
采用hasNextXxxx() 的話,后面也要用nextXxxx():
比如前面用hasNextLine(),那么后面要用 nextLine() 來(lái)處理輸入;
后面用 nextInt() 方法的話,那么前面要使用 hasNext()方法去判斷.
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Struts2源碼分析之ParametersInterceptor攔截器
這篇文章主要介紹了Struts2源碼分析之ParametersInterceptor攔截器,ParametersInterceptor攔截器其主要功能是把ActionContext中的請(qǐng)求參數(shù)設(shè)置到ValueStack中,,需要的朋友可以參考下2019-06-06Kylin對(duì)接JDBC集成Zepplin的實(shí)現(xiàn)方法
Zepplin是一個(gè)非常好用的編輯器工具,通過(guò)自定義編碼可以實(shí)現(xiàn)更多的業(yè)務(wù)邏輯,接下來(lái)通過(guò)本文給大家分享Kylin對(duì)接JDBC和Zepplin的操作代碼,感興趣的朋友跟隨小編一起看看吧2021-05-05SpringCloud?分布式微服務(wù)架構(gòu)操作步驟
SpringCloud是一種微服務(wù)的框架,利用它我們可以去做分布式服務(wù)開(kāi)發(fā),這篇文章主要介紹了SpringCloud?分布式微服務(wù)架構(gòu),需要的朋友可以參考下2022-07-07springboot操作阿里云OSS實(shí)現(xiàn)文件上傳,下載,刪除功能
這篇文章主要介紹了springboot操作阿里云OSS實(shí)現(xiàn)文件上傳,下載,刪除功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11Struts2 Result 返回JSON對(duì)象詳解
這篇文章主要講解Struts2返回JSON對(duì)象的兩種方式,講的比較詳細(xì),希望能給大家做一個(gè)參考。2016-06-06Java之 TreeSet的詳細(xì)使用說(shuō)明
這篇文章主要介紹了Java之 TreeSet的詳細(xì)使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02Java并發(fā)編程之閉鎖與柵欄的實(shí)現(xiàn)
這篇文章主要介紹了Java并發(fā)編程之閉鎖與柵欄的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04關(guān)于mybatis使用${}時(shí)sql注入的問(wèn)題
這篇文章主要介紹了關(guān)于mybatis使用${}時(shí)sql注入的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12