java小白——try-catch语句中的while循环问题

无限循环问题

在今天的课堂练习中,我想实现在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)在此不进行解释

此文章可能有诸多纰漏,如有问题欢迎提出,并在此感谢网上诸位大神的解决方案,本人只是进行一个个人的汇总。

©️2020 CSDN 皮肤主题: 我行我“速” 设计师:Amelia_0503 返回首页