问题描述
代码示例
public class Example {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (true){
System.out.print("正常输入一个数字: ");
int anInt = scanner.nextInt();//正常输入
try {
//错误输入的字符
System.out.print("输入账号: ");
int username = scanner.nextInt();
System.out.print("输入密码: ");
int passWorld = scanner.nextInt();
System.out.println("账号: "+username+"密码: "+passWorld);
break;
} catch (Exception e) {
System.out.println("非法输入,请重试");
}
}
}
}
上面代码运行之后,错误输入字符之后。
产生原因
用户输入非法字符串作为账号和密码时,会导致scanner.nextInt()方法抛出InputMismatchException异常。这个异常捕获后会进入到catch快中,输入提示。然后继续循环。
由于异常没有处理,输入流中的非法字符串仍然存在,下一次循环时,scanner.nextInt()会尝试读取这个非法字符串,但由于它无法转换为整数,又会抛出相同的异常。
解决方案
-
在catch块中添加代码来清除输入流中的非法字符串,以确保下一次输入可以正常运行,在catch块中添加scanner.next()来读取并丢弃输入流中的非法字符串,使得下一次循环可以正常进行。
-
使用完scanner之后直接关闭close,使用的时候再创建,当然不推荐这种方式,资源开销大。
-
使用的Scanner里面的hasNextInt()方法替代nextInt()方法做判断。