今天我做作业时,在循环结构中,使用Scanner语句从键盘接收数据,我故意输入一个无法接收的数据,然后利用输入不匹配异常来捕获这个异常,我预想的是捕获异常后会在下一轮循环中,在从键盘输入数据这个语句中,线程会挂起,等待用户输入数据,结果不如人意,导致陷入了死循环。
代码如下:
while (action) {
try {
System.out.print("请输入如您想修改第几位学生的成绩(从1开始):");
int stuNum = sc.nextInt(); // 记录要修改哪位学生的成绩
if ((stuNum - 1) < 0 || stuNum > scores.length) { // 判断用户输入的数字是否满足数组下标要求
System.out.println("您输入的数据非法,请重新输入数据。");
} else {
System.out.println("请输入新的成绩:");
double newScore = sc.nextDouble();
if (newScore > 100 || newScore < 0) { // 如果输入新的成绩满足条件则认为是非法数据,便不会存储。
System.out.println("数据非法,无法存储");
} else {
scores[stuNum - 1] = newScore;
System.out.println("请输入继续/退出");
String userInput = sc.next();
if (!"继续".equals(userInput)) {
System.out.println("该操作已经结束!!!");
action = false;
}
}
}
} catch (InputMismatchException e) {
System.out.println("请输入正确的数字");
}
}
我上网查了一下,说是nextInt()等接收键盘数据的方法的基本类型在输入数据导致产生不匹配异常后,下一次会失效,线程不会在挂起。这就导致了程序的死循环。
后来我在慕课网的一位老师的讲解视频中看到有这个问题的解决方法,那便是在catch语句块中加入Scanner类的next()方法,这样就可以等到下一轮循环,会继续在nextInt()等接收键盘数据的方法处,线程还是会挂起,等待用户输入数据。
改进代码如下:
while (action) {
try {
System.out.print("请输入如您想修改第几位学生的成绩(从1开始):");
int stuNum = sc.nextInt(); // 记录要修改哪位学生的成绩
if ((stuNum - 1) < 0 || stuNum > scores.length) { // 判断用户输入的数字是否满足数组下标要求
System.out.println("您输入的数据非法,请重新输入数据。");
} else {
System.out.println("请输入新的成绩:");
double newScore = sc.nextDouble();
if (newScore > 100 || newScore < 0) { // 如果输入新的成绩满足条件则认为是非法数据,便不会存储。
System.out.println("数据非法,无法存储");
} else {
scores[stuNum - 1] = newScore;
System.out.println("请输入继续/退出");
String userInput = sc.next();
if (!"继续".equals(userInput)) {
System.out.println("该操作已经结束!!!");
action = false;
}
}
}
} catch (InputMismatchException e) {
System.out.println("请输入正确的数字");
sc.next();
}
}