next数值型数据类型()出现输入错误后,下次依然能正常输入
1 出现的场景
1.1 内容
next数值型数据()方法指的是nextInt()、nextDouble()、nextByte()等数值型接收方法
用try…catch将数字型接收方法包起来,当输入是字符串时,程序依然不会中断,会提示用户再次输入,再次调用nextInt()方法时,会发现用户直接输入不了了,直接进入死循环了,但是一直有输入提示语句
1.2 示例代码
package Work;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
boolean flag=true;
//当不出现异常时,就设置为false,就退出循环
int n=0;
while(flag){
System.out.println("请输入数字n:");
try {
n=s.nextInt();
flag=false;
} catch (InputMismatchException e) {
System.out.println("输入有误,请重新输入!!!!");
} catch (Exception e){
}
}
}
}
1.3 示例代码运行
2 为啥出现这个问题
用nextInt()方法去接收用户输入的数据时,会先检查空间里面是否存在数据,若不存在才会需要用户输入一个数据后,输入完数据并按下回车后才会执行下一条语句,此时会先把用户的数据放入一个空间
当用户输入的类型和nextInt()的方法是匹配成功的,就会把空间里面存放的数据拿出来,然后把空间里面的值清空
当用户输入的类型和nextInt()的方法匹配不成功时,此时空间里面的值不会被拿出来,你下次调用nextInt()的时候还是拿的这个值,因为空间里面可以拿到值就无需用户去输入值,而且用try…catch处理异常了,这程序就不会被中断,所以程序就一直执行下去了
3 如何解决这个问题
3.1 核心点
你要把在空间中的错误信息给吸收并释放掉,
3.2 解决方案
在catch代码块里面写上next()方法用于接收空间中的错误信息,使得空间中的数据能够被释放
3.3 解决的示例代码
package Work;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
boolean flag=true;
//当不出现异常时,就设置为false,就退出循环
int n=0;
while(flag){
System.out.println("请输入数字n:");
try {
n=s.nextInt();
flag=false;
} catch (InputMismatchException e) {
s.next();
//用于吸收掉前面输入的错误信息
System.out.println("输入有误,请重新输入!!!!");
} catch (Exception e){
}
}
System.out.println("程序正常结束了!!!");
}
}