Java中Scanner的使用及nextLine和nextInt等混用報錯解決方案
1.Scanner類的概述
Scanner類用于掃描從控制臺輸入的數(shù)據(jù),可以接收字符串和基本數(shù)據(jù)類型的數(shù)據(jù)。位于java.util.Scanner包中。
2.常用方法
1、String next();
- 作用:接收控制臺輸入的一個字符串。
- 注意:以空格和回車為結(jié)束符
2、String nextLine();
- 作用:接收控制臺輸入的一個字符串。
- 注意:以回車為結(jié)束符
3、int nexInt();
- 作用:接收控制臺輸入的一個int類型的數(shù)據(jù)。
- 注意:以空格和回車為結(jié)束符
4、double nextDouble();
- 作用:接收控制臺輸入的一個double類型的數(shù)據(jù)。
- 注意:以空格和回車為結(jié)束符
5、boolean nextBoolean();
- 作用:接收控制臺輸入的一個boolean類型的數(shù)據(jù)。
- 注意:以空格和回車為結(jié)束符
3.案例測試
//步驟1、創(chuàng)建Scanner類的一個對象。 Scanner scanner=new Scanner(System.in); //步驟2、通過scanner調(diào)用next等方法,接收控制臺輸入的數(shù)據(jù)。 System.out.println(“姓名:”); String name=scanner.next();
4.常見錯誤情況
import java.util.Scanner;
public class Tess {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int age = scanner.nextInt();
String name = scanner.nextLine();
double salary = scanner.nextDouble();
System.out.println(age);
System.out.println(name);
System.out.println(salary);
}
}

代碼和錯誤如上,操作:輸入18回車,輸入張三回車。
本來,我們應(yīng)該輸入三行,可是我們只輸入了兩行數(shù)據(jù),就報錯。
并且報錯信息說明是nextDouble的錯誤。到底是怎么回事呢。
問題分析:
由于是nextDouble報錯,可見,上面幾行都是沒有問題的。
所有我們調(diào)整一下代碼位置,查看一下具體每行的賦值,當然個人可以Debug更加方便。
調(diào)整為輸入一個,輸出一個。并按照之前操作輸入數(shù)據(jù)
public class Tess {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int age = scanner.nextInt();
System.out.println("age:" + age);
String name = scanner.nextLine();
System.out.println("name:" +name);
double salary = scanner.nextDouble();
System.out.println("salary:" +salary);
}
}

如上圖可以看到,當我們輸入18的時候,age和name都已經(jīng)被賦值,所以當輸入張三時,會賦值給salary,類型轉(zhuǎn)換不了,所以報錯。
結(jié)論:
經(jīng)過分析,我們可以得出nextDouble()等方法,讀出空格或者回車前的字符串或者數(shù)字,并且下次讀時不會切換到空格或者回車之后(也就是還在18之后紅線處繼續(xù)讀,不會切換到一行)。而nextLine則會讀取本行且下次自動切換到下一行開頭讀。

5.解決方法
5.1方法一
遇到nextLine再回車,其他都用空格隔開
代碼同上

nextInt 之后用空格隔開,而name是nextLine所以輸完張三,回車,最后一個輸入無所謂。
5.2方法二
就想一行輸入一個,那么每個出來nextDouble、nextInt等方法后面都要加上一句不需要賦值的nextLine,為了把讀的位置切換到下一行。
import java.util.Scanner;
public class Tess {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int age = scanner.nextInt();
scanner.nextLine();//把讀的位置切換到下一行
String name = scanner.nextLine();
double salary = scanner.nextDouble();
scanner.nextLine();//把讀的位置切換到下一行
System.out.println("age:" + age);
System.out.println("name:" + name);
System.out.println("salary:" + salary);
}
}

5.3方法三
也是最簡單粗暴的方法,全程用next代替nextLine,缺點是不可以接受帶空格的字符串
import java.util.Scanner;
public class Tess {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int age = scanner.nextInt();
String name = scanner.next();
double salary = scanner.nextDouble();
System.out.println("age:" + age);
System.out.println("name:" + name);
System.out.println("salary:" + salary);
}
}


可以看到,不用考慮回車問題,但是字符串不能輸入空格。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
springBoot的事件機制GenericApplicationListener用法解析
這篇文章主要介紹了springBoot的事件機制GenericApplicationListener用法解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值的相關(guān)資料2019-09-09
Java skill動態(tài)指定feign的訪問地址方式
在使用Feign調(diào)用內(nèi)部服務(wù)時,通過Redis查詢ELB地址并進行調(diào)用,遇到的問題包括:指定的地址在Nacos服務(wù)名中不存在時,URL參數(shù)需要賦初始值;使用ThreadLocal獲取當前線程信息時易出問題,建議使用MDC跨線程傳遞參數(shù),并注意請求結(jié)束后的清理2026-01-01
java中hashCode方法與equals方法的用法總結(jié)
總的來說,Java中的集合(Collection)有兩類,一類是List,再有一類是Set。前者集合內(nèi)的元素是有序的,元素可以重復(fù);后者元素無序,但元素不可重復(fù)2013-10-10
Springboot2.x+Quartz分布式集群的實現(xiàn)
這篇文章主要介紹了Springboot2.x+Quartz分布式集群的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09

