本文最后更新于:2 个月前
Scanner无法输入问题
问题复现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| package test;
import java.util.Scanner;
public class Tests {
public static void main(String[] args) { System.out.println("请输入数字:"); Scanner scanner = new Scanner(System.in); int flag = 0; while(flag++<3){ int a = 0; try { a = scanner.nextInt(); } catch (Exception e) { flag--; System.out.println("非法输入,请重新输入!"); continue; } System.out.println("输入内容为: "+a); } scanner.close(); System.out.println("程序结束!"); } }
|
当输入非数字时,控制台输出:
1 2 3 4 5 6
| 请输入数字: a 非法输入,请重新输入! 非法输入,请重新输入! 非法输入,请重新输入! ...
|
问题:为什么捕获异常后,下次循环就不让重新输入内容,而仍是获取上次的数据呢?
回答:主要是因为scanner的机制是:scanner会扫描输入栈缓冲区,每次会先判断缓冲区内有没有输入的数据,如果有就执行next方法弹出并返回栈顶数据。如果没有,则等待用户输入数据。在这里,由于用户输入了字符,但数据返回的格式是整型数据,导致字符无法返回出来,所以缓冲区内就一直没清空,有数据就不会开启输入,每次调用都会返回栈顶元素却因格式不对弹不出来,栈顶元素与返回格式不一致,就会一直出现上次的错误。
解决方法:
方法一:用string类型把数据输入栈缓冲区的栈顶数据取出来。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| package test;
import java.util.Scanner;
public class Tests { public static void main(String[] args) { System.out.println("请输入数字:"); Scanner scanner = new Scanner(System.in); int flag = 0; while(flag++<3){ int a = 0; String b = null; try { a = scanner.nextInt(); } catch (Exception e) { b = scanner.next(); flag--; System.out.println("非法输入,请重新输入!非法数据:"+b); continue; } System.out.println("输入内容为: "+a); } scanner.close(); System.out.println("程序结束!"); } }
|
运行结果:
1 2 3 4 5 6 7 8 9 10
| 请输入数字: 1 输入内容为: 1 a 非法输入,请重新输入!非法数据: a 2 输入内容为: 2 3 输入内容为: 3 程序结束!
|
方法二:重置scanner
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| package test;
import java.util.Scanner;
public class Tests { public static void main(String[] args) { System.out.println("请输入数字:"); Scanner scanner = new Scanner(System.in); int flag = 0; while(flag++<3){ int a = 0; try { a = scanner.nextInt(); } catch (Exception e) { scanner.reset(); scanner = new Scanner(System.in); System.out.println("非法输入,请重新输入! "); flag--; continue; } System.out.println("输入内容为: "+a); } scanner.close(); System.out.println("程序结束!"); } }
|
运行结果:
1 2 3 4 5 6 7 8 9 10
| 请输入数字: 1 输入内容为: 1 a 非法输入,请重新输入! 1 输入内容为: 1 2 输入内容为: 2 程序结束!
|