Java中Scanner類基礎(chǔ)使用、可能遇到的問題及注意事項(xiàng)
一、Scanner 類概述
Scanner 類是 Java 中用于獲取用戶輸入的一個(gè)實(shí)用類,它位于 java.util
包下。
通過 Scanner 類,可以方便地從多種輸入源(比如標(biāo)準(zhǔn)輸入流,也就是鍵盤輸入,或者文件等)讀取不同類型的數(shù)據(jù),例如整數(shù)、小數(shù)、字符串等,大大簡(jiǎn)化了輸入操作相關(guān)的編程工作。
二、Scanner 類的創(chuàng)建
在使用 Scanner 類之前,需要先創(chuàng)建它的對(duì)象。如果要從標(biāo)準(zhǔn)輸入(鍵盤)讀取數(shù)據(jù),創(chuàng)建示例代碼如下:
import java.util.Scanner; public class ScannerExample { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 后續(xù)可使用該scanner對(duì)象進(jìn)行輸入讀取操作 } }
這里通過 new Scanner(System.in)
創(chuàng)建了一個(gè) Scanner 對(duì)象,System.in
表示標(biāo)準(zhǔn)輸入流,意味著后續(xù)操作將從鍵盤獲取輸入內(nèi)容。
三、常用方法及讀取不同類型數(shù)據(jù)
1.讀取整數(shù)
使用 nextInt()
方法可以讀取用戶輸入的整數(shù),示例代碼如下:
import java.util.Scanner; public class ReadInt { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("請(qǐng)輸入一個(gè)整數(shù):"); int num = scanner.nextInt();//程序執(zhí)行到這里就會(huì)停下來,等待鍵盤的輸入。 //鍵盤如果沒有輸入,這里就會(huì)一直卡著 //直到用戶輸入了內(nèi)容之后,敲回車,這行代碼就執(zhí)行結(jié)束了 //這樣就完成了數(shù)據(jù)從控制臺(tái)到內(nèi)存 System.out.println("你輸入的整數(shù)是: " + num); scanner.close(); } }
這里提示用戶輸入整數(shù)后,調(diào)用 nextInt()
方法獲取輸入并賦值給 int
類型的變量 num
,最后輸出展示讀取到的整數(shù)內(nèi)容。需要注意的是,在讀取完成后,如果不再需要使用該 Scanner 對(duì)象,最好調(diào)用 scanner.close()
方法關(guān)閉它,以釋放相關(guān)資源。
注意:針對(duì)nextInt()方法來說,只能接收整數(shù)數(shù)字。輸入其他的字符串會(huì)報(bào)錯(cuò)。
2.讀取浮點(diǎn)數(shù)(小數(shù))
若要讀取浮點(diǎn)數(shù),可以使用 nextFloat()
方法(讀取單精度浮點(diǎn)數(shù)) 或者 nextDouble()
方法(讀取雙精度浮點(diǎn)數(shù)),示例代碼如下:
import java.util.Scanner; public class ReadFloat { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("請(qǐng)輸入一個(gè)單精度浮點(diǎn)數(shù):"); float fNum = scanner.nextFloat(); System.out.println("你輸入的單精度浮點(diǎn)數(shù)是: " + fNum); System.out.println("請(qǐng)輸入一個(gè)雙精度浮點(diǎn)數(shù):"); double dNum = scanner.nextDouble(); System.out.println("你輸入的雙精度浮點(diǎn)數(shù)是: " + dNum); scanner.close(); } }
上述代碼分別演示了讀取單精度和雙精度浮點(diǎn)數(shù)的過程,按照提示輸入相應(yīng)類型的小數(shù),就能通過對(duì)應(yīng)方法獲取并輸出展示。
3.讀取字符串
讀取字符串有兩種常用方式,一種是 next() 方法,一種是 nextLine() 方法。
(1).next() 方法: 它讀取輸入的下一個(gè)單詞(以空格、制表符等空白字符作為分隔符)
細(xì)節(jié):從鍵盤上接收一個(gè)字符串,但是接收的是第一個(gè)空格之前的內(nèi)容
示例代碼1:
import java.util.Scanner; public class ReadStringNext { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("請(qǐng)輸入一些單詞(以空格分隔):"); String word = scanner.next(); System.out.println("你輸入的單詞是: " + word); scanner.close(); } }
輸入多個(gè)單詞時(shí),它只會(huì)獲取第一個(gè)單詞并返回。
示例代碼2:
import java.util.Scanner; public class scannerTest { public static void main(String[] args) { Scanner s=new Scanner(System.in); String username=s.next(); System.out.println(username); } }
(2).nextLine()
方法:
該方法讀取輸入的一整行內(nèi)容,示例代碼:
import java.util.Scanner; public class ReadStringNextLine { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("請(qǐng)輸入一行文字:"); String line = scanner.nextLine(); System.out.println("你輸入的文字內(nèi)容是: " + line); scanner.close(); } }
它會(huì)獲取從當(dāng)前位置到行尾的所有字符,更適合讀取完整的語(yǔ)句等情況。
注意:從鍵盤上接收一個(gè)字符串,但是接收的是第一個(gè)換行符\n之前的內(nèi)容
可能遇到的問題及注意事項(xiàng)
1.輸入不匹配異常
如果用戶輸入的數(shù)據(jù)類型和期望讀取的數(shù)據(jù)類型不一致,例如:期望讀取整數(shù),但用戶輸入了字母等非數(shù)字內(nèi)容,會(huì)拋出 InputMismatchException 異常。所以在實(shí)際應(yīng)用中,可能需要添加異常處理代碼來讓程序更健壯,示例如下:
import java.util.InputMismatchException; import java.util.Scanner; public class ExceptionHandle { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); try { System.out.println("請(qǐng)輸入一個(gè)整數(shù):"); int num = scanner.nextInt(); System.out.println("你輸入的整數(shù)是: " + num); } catch (InputMismatchException e) { System.out.println("輸入的數(shù)據(jù)類型不正確,請(qǐng)重新輸入整數(shù)!"); } finally { scanner.close(); } } }
這里使用 try-catch
語(yǔ)句塊捕獲可能出現(xiàn)的輸入類型不匹配異常,并在 catch
塊中給出相應(yīng)提示,無論是否出現(xiàn)異常,最終都會(huì)在 finally
塊中關(guān)閉 Scanner 對(duì)象。
2.nextLine() 方法使用的坑
由于nextInt()只讀取整數(shù),不讀取后續(xù)的換行符,這會(huì)導(dǎo)致nextLine()在下一次調(diào)用時(shí)直接讀取空字符串。解決方法是使用nextLine()獲取整數(shù)后的換行符,避免空字符導(dǎo)致的跳過輸入現(xiàn)象。
import java.util.Scanner; public class scannerTest { public static void main(String[] args) { Scanner s=new Scanner(System.in); String username=s.next(); //無論是next(),還是nextInt(),nextDouble()這幾個(gè)方法接收的是第一個(gè)空格之前的內(nèi)容 //而對(duì)于 son依舊留在緩存中,其在緩存的格式為 son\r(回車符) System.out.println(username); String position=s.nextLine();//執(zhí)行到這一行時(shí),nextLine回去緩存讀內(nèi)容,而讀到\r時(shí)就結(jié)束了 //即讀取了 son //所以這一行的運(yùn)行,用戶無法輸入東西 System.out.println(position); String name =s.nextLine(); System.out.println(name); } }
運(yùn)行結(jié)果:
當(dāng)在調(diào)用 nextInt() 或者其他讀取基本類型的方法(如 nextFloat() 等)后緊接著調(diào)用 nextLine() 方法時(shí),可能會(huì)出現(xiàn)問題。因?yàn)?nextInt() 等方法讀取數(shù)據(jù)后,留下的換行符(回車鍵對(duì)應(yīng)的字符)會(huì)被 nextLine() 當(dāng)作輸入內(nèi)容讀取,導(dǎo)致 nextLine() 似乎 “跳過” 了用戶的輸入。解決辦法通常是在調(diào)用 nextLine() 之前,先額外調(diào)用一次 nextLine() 來消耗掉前面留下的換行符,示例如下:
import java.util.Scanner; public class NextLineIssue { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("請(qǐng)輸入一個(gè)整數(shù):"); int num = scanner.nextInt(); scanner.nextLine(); // 消耗掉換行符 System.out.println("請(qǐng)輸入一行文字:"); String line = scanner.nextLine(); System.out.println("你輸入的文字內(nèi)容是: " + line); scanner.close(); } }
總之,Scanner 類在 Java 中是很常用的用于處理輸入的類,掌握好它的使用方法以及注意相關(guān)問題,能更好地實(shí)現(xiàn)具有交互性的 Java 程序。
總結(jié)
到此這篇關(guān)于Java中Scanner類基礎(chǔ)使用、可能遇到的問題及注意事項(xiàng)的文章就介紹到這了,更多相關(guān)Java基礎(chǔ)Scanner類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解RabbitMQ中延遲隊(duì)列結(jié)合業(yè)務(wù)場(chǎng)景的使用
這篇文章主要介紹了詳解RabbitMQ中延遲隊(duì)列結(jié)合業(yè)務(wù)場(chǎng)景的使用,延遲隊(duì)列中的元素都是帶有時(shí)間屬性的,延遲隊(duì)列就是用來存放需要在指定時(shí)間被處理的元素的隊(duì)列,需要的朋友可以參考下2023-05-05Spring Security之默認(rèn)的過濾器鏈及自定義Filter操作
這篇文章主要介紹了Spring Security之默認(rèn)的過濾器鏈及自定義Filter操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06Java中byte[]、String、Hex字符串等轉(zhuǎn)換的方法
這篇文章主要介紹了Java中byte[]、String、Hex字符串等轉(zhuǎn)換的方法,代碼很簡(jiǎn)單,需要的朋友可以參考下2018-05-05