Java中Scanner類基礎(chǔ)使用、可能遇到的問(wèn)題及注意事項(xiàng)
一、Scanner 類概述
Scanner 類是 Java 中用于獲取用戶輸入的一個(gè)實(shí)用類,它位于 java.util 包下。
通過(guò) 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)行輸入讀取操作
}
}這里通過(guò) 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ì)停下來(lái),等待鍵盤的輸入。
//鍵盤如果沒(méi)有輸入,這里就會(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()方法來(lái)說(shuō),只能接收整數(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ù)的過(guò)程,按照提示輸入相應(yīng)類型的小數(shù),就能通過(guò)對(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)容
可能遇到的問(wèn)題及注意事項(xiàng)
1.輸入不匹配異常
如果用戶輸入的數(shù)據(jù)類型和期望讀取的數(shù)據(jù)類型不一致,例如:期望讀取整數(shù),但用戶輸入了字母等非數(shù)字內(nèi)容,會(huì)拋出 InputMismatchException 異常。所以在實(shí)際應(yīng)用中,可能需要添加異常處理代碼來(lái)讓程序更健壯,示例如下:
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)提示,無(wú)論是否出現(xiàn)異常,最終都會(huì)在 finally 塊中關(guān)閉 Scanner 對(duì)象。
2.nextLine() 方法使用的坑
由于nextInt()只讀取整數(shù),不讀取后續(xù)的換行符,這會(huì)導(dǎo)致nextLine()在下一次調(diào)用時(shí)直接讀取空字符串。解決方法是使用nextLine()獲取整數(shù)后的換行符,避免空字符導(dǎo)致的跳過(guò)輸入現(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(); //無(wú)論是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)行,用戶無(wú)法輸入東西
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)問(wèn)題。因?yàn)?nextInt() 等方法讀取數(shù)據(jù)后,留下的換行符(回車鍵對(duì)應(yīng)的字符)會(huì)被 nextLine() 當(dāng)作輸入內(nèi)容讀取,導(dǎo)致 nextLine() 似乎 “跳過(guò)” 了用戶的輸入。解決辦法通常是在調(diào)用 nextLine() 之前,先額外調(diào)用一次 nextLine() 來(lái)消耗掉前面留下的換行符,示例如下:
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)問(wèn)題,能更好地實(shí)現(xiàn)具有交互性的 Java 程序。
總結(jié)
到此這篇關(guān)于Java中Scanner類基礎(chǔ)使用、可能遇到的問(wèn)題及注意事項(xiàng)的文章就介紹到這了,更多相關(guān)Java基礎(chǔ)Scanner類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot整合Shiro思路(最新超詳細(xì))
這篇文章主要介紹了SpringBoot整合Shiro思路(最新超詳細(xì)),本文內(nèi)容比較長(zhǎng),通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
詳解java實(shí)現(xiàn)遍歷二叉樹(shù)的三種情況
這篇文章主要介紹了java實(shí)現(xiàn)遍歷二叉樹(shù)的三種情況,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04
SpringBoot實(shí)現(xiàn)api加密的示例代碼
在項(xiàng)目中,為了保證數(shù)據(jù)的安全,我們常常會(huì)對(duì)傳遞的數(shù)據(jù)進(jìn)行加密。本文主要介紹了SpringBoot實(shí)現(xiàn)api加密的示例代碼,感興趣的小伙伴們可以參考一下2021-07-07
SpringBoot 整合 Shiro 密碼登錄的實(shí)現(xiàn)代碼
這篇文章主要介紹了SpringBoot 整合 Shiro 密碼登錄的實(shí)現(xiàn),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02
IntelliJ IDEA開(kāi)發(fā)Maven時(shí)工具欄消失的三種恢復(fù)方法
在使用IntelliJ IDEA(簡(jiǎn)稱 IDEA)開(kāi)發(fā)Maven項(xiàng)目時(shí),偶爾會(huì)遇到右側(cè)或側(cè)邊欄的Maven工具欄突然消失的情況,這可能影響開(kāi)發(fā)者快速操作Maven構(gòu)建、依賴管理等功能,甚至導(dǎo)致項(xiàng)目配置混亂,所以本文給大家介紹了快速恢復(fù)Maven工具欄的3種方法,需要的朋友可以參考下2025-06-06
java多線程編程之使用runnable接口創(chuàng)建線程
實(shí)現(xiàn)Runnable接口的類必須使用Thread類的實(shí)例才能創(chuàng)建線程,通過(guò)Runnable接口創(chuàng)建線程分為以下兩步2014-01-01

