Java中使用nextLine输入数据时遇到InputMismatchException异常的解决办法
异常产生的背景:
今天在写一个很简单的编程练习“计算飞机票的实际价格”时,使用nextLine输入数据时遇到了
InputMismatchException
异常。
InputMismatchException异常
InputMismatchException
异常:是输入不匹配异常,即输入的值数据类型与设置的值数据类型不能匹配。
我遇到的问题:
package com.hhxy.practice;
import java.util.Scanner;
public class Test{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请您输入机票的原价");
double price = sc.nextDouble();
System.out.println("请输入机舱类型:头等舱 or 经济舱");
String type = sc.nextLine();//报InputMismatchException异常
System.out.println("请输入月份信息:1~12月");
int month = sc.nextInt();
}
}
异常出现的原因:
sc.next()/sc.Double()/sc.nextInt()/
等方法都是接收到各自的有效字符后遇到空格或者回车才结束输入,此时空格或回车,以及空格或回车后面的数据仍存在缓冲区中,后续的sc.方法
会优先接收留在缓冲区中的数据。而sc.nextLine()
方法是遇到回车就结束输入。明白这两类方法的区别,问题就迎刃而解了😆
分析:当我输入100后,我按了回车想接着输入机舱类型,但此时机舱类型的输入使用的是sc.nextLine()
方法,就在我在第一次输入100的时候,最后那个回车进入了缓冲区,直接被sc.nextLine()
遇到并吸收了,sc.nextLine()
方法直接就终止了输入,type直接为null,此时我的第二次输入内容就并不是被type接收,而是被month接收,month是int类型,当然就直接报InputMismatchException
异常啦,恍然大悟🐒
异常解决的方法:
- 方法1:在type类型的前面再写一个
sc.nextLine()
用来吸收存在缓冲区中的回车- 方法2:将
sc.nextLine()
换成sc.next()
(这个很好理解,因为sc.next会过滤掉有效字符前的非有效字符,只有接收到有效字符后遇到非有效字符才结束输入)
- 测试:
package com.hhxy.practice;
import java.util.Scanner;
public class Test1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
String st1 = sc.nextLine();//直接将回车给吸收了
String st2 = sc.nextLine();
System.out.println("a="+a);
System.out.println("st1="+st1);
System.out.println("st2="+st2);
}
}
sc.nextLine()
在遇到sc.nextInt()
输入时留在缓冲区中的回车直接结束输入,导致str1=null
sc.nextInt()
会自动过滤掉有效字符前的非有效字符
总结:
-
sc.nextLine()
方法接收参数,从输入开始接收,遇到回车结束接收,同时吸收回车 -
sc.next()\sc.nextInt()\sc.nextDouble()
等方法,从输入有效字符开始接收,遇到回车、空格结束接收,同时不会吸收回车、空格,回车、空格会留在缓冲区