无限循环问题
在今天的课堂练习中,我想实现在try-catch语句中实现循环输入,
即为当输入错误时,捕获异常输出,且可以重新输入。
第一次编写的代码:(此代码存在bug)
package 异常;
import java.io.Console;
import java.util.Scanner;
import javax.management.RuntimeErrorException;
public class Test4 {
public static double avg(double x,int y){
double avg = 0;
if (y==0) {
throw new RuntimeException("除数不能为0!");
}
else{
avg = x/y;
}
return avg;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(true){
try {
System.out.println("请输入总成绩:");
double x = scanner.nextDouble();
System.out.println("请输入总人数:");
int y = scanner.nextInt();
double avg = avg(x, y);
System.out.println("平均成绩为:"+avg);
}
catch (RuntimeException e) {
System.out.println(e.getMessage());
continue;
}
catch (Exception e) {
System.out.println("请输入数字!");
continue;
}
finally {
scanner.close();
}
break;
}
}
}
运行结果:
出现了无限循环
解决方法
bug原因
- 当输入异常时,捕捉到异常Exception,开始下一次的循环,但是此时数据缓冲区依旧留有我上次输入的异常数据,并没有清除这些数据,这时就又开始捕捉异常Exception,还是错误,于是这个异常一直被捕捉一直被输出。出现了无限循环的bug。
那么解决的方法就是将捕捉到的异常Exception数据去清除。
方案一:在catch()语句之中加上scanner.next();
代码如下:
package 异常;
import java.io.Console;
import java.util.Scanner;
import javax.management.RuntimeErrorException;
public class Test4 {
public static double avg(double x,int y){
double avg = 0;
if (y==0) {
throw new RuntimeException("除数不能为0!");
}
else{
avg = x/y;
}
return avg;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(true){
try {
System.out.println("请输入总成绩:");
double x = scanner.nextDouble();
System.out.println("请输入总人数:");
int y = scanner.nextInt();
double avg = avg(x, y);
System.out.println("平均成绩为:"+avg);
}
catch (RuntimeException e) {
System.out.println(e.getMessage());
scanner.next();
}
catch (Exception e) {
System.out.println("请输入数字!");
scanner.next();
}
}
}
}
成功结束循环
方案二:将Scanner的对象scanner写在try语句之中
代码如下:
package 异常;
import java.io.Console;
import java.util.Scanner;
import javax.management.RuntimeErrorException;
public class Test4 {
public static double avg(double x,int y){
double avg = 0;
if (y==0) {
throw new RuntimeException("除数不能为0!");
}
else{
avg = x/y;
}
return avg;
}
public static void main(String[] args) {
while(true){
try {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入总成绩:");
double x = scanner.nextDouble();
System.out.println("请输入总人数:");
int y = scanner.nextInt();
double avg = avg(x, y);
System.out.println("平均成绩为:"+avg);
}
catch (RuntimeException e) {
System.out.println(e.getMessage());
}
catch (Exception e) {
System.out.println("请输入数字!");
}
}
}
}
运行结果:
成功结束循环!
ps:
try-catch语句一次只能捕获一个异常
**捕获或异常为null(Caught Throwable or Exception is null)
此bug请详情看此文章(http://www.it1352.com/619288.html)在此不进行解释
此文章可能有诸多纰漏,如有问题欢迎提出,并在此感谢网上诸位大神的解决方案,本人只是进行一个个人的汇总。