问题描述
代码示例
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()方法做判断。