【报错】scancer的inputmismatchexception死循环报错-爱代码爱编程
我们使用Scancer.haxNextInt()等具体类型的函数获取输入值的时候,可能遇到类型不匹配的报错,我们一般会catch报错。但是之后,我们仍然无法继续输入,而是一致循环报错
使用try/catch
public static void test1(){
Scanner scanner = new Scanner(System.in);
int i = 0;
while (i<3){
try {
int a = scanner.nextInt();
System.out.println(a);
}catch (Exception e) {
e.printStackTrace();
}finally {
i++;
}
}
scanner.close();
}
会产生如下报错
或者使用if/else
public static void test2(){
Scanner scanner = new Scanner(System.in);
int i = 0;
while (i<3){
if(scanner.hasNextInt()) {
int a = scanner.nextInt();
System.out.println(a);
}else{
System.out.println("输入不合法");
}
i++;
}
scanner.close();
}
会产生如下报错
解决方法
产生报错的原因是,Scancer缓冲区中的值尚未被取走,所以下次循环依然是上一次不正确的值
所以我们可以通过next()或者nextLine()取走
public static void test3(){
Scanner scanner = new Scanner(System.in);
int i = 0;
while (i<3){
try {
int a = scanner.nextInt();
System.out.println(a);
}catch (Exception e) {
System.out.println(scanner.nextLine()+"不合法");
e.printStackTrace();
}finally {
i++;
}
}
scanner.close();
}
问题解决,如下图
或者,我们可以给scancer重新赋值,清空缓冲区
public static void test4(){
Scanner scanner = new Scanner(System.in);
int i = 0;
while (i<3){
try {
int a = scanner.nextInt();
System.out.println(a);
}catch (Exception e) {
scanner=new Scanner(System.in);
e.printStackTrace();
}finally {
i++;
}
}
scanner.close();
}
问题解决如下