Scanner无法输入问题

本文最后更新于: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) {
// TODO 自动生成的方法存根
System.out.println("请输入数字:");
Scanner scanner = new Scanner(System.in);
//标志位
int flag = 0;
while(flag++<3){ //有效次数为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) {
// TODO 自动生成的方法存根
System.out.println("请输入数字:");
//实例化Scanner
Scanner scanner = new Scanner(System.in);
//标志位
int flag = 0;
while(flag++<3){//有效次数为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) {
// TODO 自动生成的方法存根
System.out.println("请输入数字:");
//实例化Scanner
Scanner scanner = new Scanner(System.in);
//标志位
int flag = 0;
while(flag++<3){//有效次数为3
int a = 0;
try {
a = scanner.nextInt();//获取数字
} catch (Exception e) { //捕获非法输入
// TODO: handle exception
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
程序结束!


Scanner无法输入问题
https://superlovelace.top/2023/11/27/EclipseCannotInput/
作者
棱境
发布于
2023年11月27日
更新于
2023年11月27日
许可协议