一顿操作猛如虎,一看运行InputMismatchException?
InputMismatchException
异常是输入不匹配异常,即输入的值数据类型与设置的值数据类型不能匹配
相信不少和我一样的初学者在使用Scanner
获取数据时都遇到过这样一种情况
在创建了一个Scanner对象后,先是用该对象的nextInt()
方法获取了一个int
类型的数据,紧接着我们需要用着同一个对象利用其nextLine()
方法获取一个String
类型的数据
在实际运行时你就会发现,程序在获取完int
类型的数据后就结束了
亦或者是在上面代码层面获取完String
类型数据的基础上再去获取一个int
类型的数据就会出现InputMismatchException
异常
那时的我才疏学浅,一度认为是创建的Scanner对象只能获取同一种数据类型,因此就用了一中最笨的方法来解决,那就是再创建一个对象来进行数据获取
在多日的深入学习后,发现自己是多么的好笑哈哈哈,所以特此在这记录一下,其原因,其原理,其解决方案
以下附上代码及图示,方便大家理解这个问题
第一种情形
import java.util.Scanner;
//第一种情形
public class tset {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个数字:");
int x = sc.nextInt();
System.out.println("请输入字符串:");
String str = sc.nextLine();
System.out.println("=====分割线=====");
System.out.println(x);
}
}
第二种情形
import java.util.Scanner;
//第二种情况
public class tset {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个数字:");
int x = sc.nextInt();
System.out.println("请输入字符串:");
String str = sc.nextLine();
System.out.println("请再输入一个数字:");
int y = sc.nextInt();
System.out.println("=====分割线=====");
System.out.println(x);
System.out.println(str);
}
}
要想解决问题,那就要先去了解问题,相信大家对前两个nextInt()
和nextLine()
都不陌生,但你真的明白它是如何工作的吗?所以在我翻查JDK开发手册后总结出如下结论
在你使用nextInt()
的时候后边有一个换行符(也就是我们回车Enter这个操作)没有被变量接受,前边的int变量只是接受了你输入的数值,因此我们回车Enter这个操作其仍存在于缓冲区中
对输入有效字符之前遇到的空格键、Tab键或回车Enter键等结束符,next()
方法会自动将其去掉,只有在输入有效字符之后,next()
方法才将其后输入的空格键、Tab键或回车Enter键等视为分隔符或结束符。所以next()
不能得到带空格的字符串。
nextLine()
是只有遇到回车Enter时才结束(只认回车Enter为其输入结束符),所以可以得到带空格的字符串
通过上面的了解,我们可以知道,在使用nextInt()
方法后,缓冲区中还存着一个未被接收的回车Enter
,如若我们紧接着使用nextLine()
方法,缓冲区的回车Enter
就会被nextLine()
方法识别为结束符,提交一个空的字符串数据,从而造成了程序开头我们看到的程序结束
和InputMismatchException异常
方法一: 我们可以在
nextInt()
后面加上一个nextLine()
用于过滤其后面的Enter等结束符。 方法二: 我们可以不使用nextLine()
方法,直接使用next()
方法代替。
其修改代码如下,这里用会出现异常的那种情形为大家展示解决问题的方式
第一种方法
import java.util.Scanner;
//第二种情况
//解决方法一
public class tset {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个数字:");
int x = sc.nextInt();
sc.nextLine(); //多输入一个NextLine()把未接收的回车Enter接收掉
System.out.println("请输入字符串:");
String str = sc.nextLine();
System.out.println("请再输入一个数字:");
int y = sc.nextInt();
System.out.println("=====分割线=====");
System.out.println(x);
System.out.println(str);
System.out.println(y);
}
}
第二种方法
import java.util.Scanner;
//第二种情况
//解决方法二
public class tset {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个数字:");
int x = sc.nextInt();
System.out.println("请输入字符串:");
String str = sc.next(); //根据next()方法的特性
//直接使用next()方法代替
//但这将使得输入内容不能带有
//诸如空格键、Tab键或Enter键
//等会被视为分隔符或结束符
System.out.println("请再输入一个数字:");
int y = sc.nextInt();
System.out.println("=====分割线=====");
System.out.println(x);
System.out.println(str);
System.out.println(y);
}
}
看了这么多~今天你学废了吗哈哈哈!
本篇文章采用 署名 4.0 国际 (CC BY 4.0) 许可协议进行许可。