递归或循环处理InputMisMatchException陷入死循环
//测试程序
public class Test01 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int num = ex(scan);
System.out.println(num);
}
}
//自定义异常
class Myxceptions{
public static int ex(Scanner scan){
int next;
try {
next = ex1(scan);
}catch(InputMismatchException e){
System.out.println("只能输入数字类型!");
scan.next();
return ex(scan);
}catch(MyException e){
System.out.println("你输入的数值不合法!");
return ex(scan);
}
return next;
}
public static int ex1(Scanner scan){
int num = scan.nextInt();
if (num < 0 || num>3){
throw new MyException("数值超出范围!");
}
return num;
}
}
//自定义异常类
public class MyException extends RuntimeException{
static final long serialVersionUID = -3387516993224229978L;
public MyException() {
}
public MyException(String message) {
super(message);
}
public MyException(String message, Throwable cause) {
super(message, cause);
}
public MyException(Throwable cause) {
super(cause);
}
}
问题
要求输入int类型数据,若输入字符串型数据,InputMisMatchException会被捕获,执行递归,程序跳过下一次输入,直接捕获异常.
原因
当扫描仪投掷InputMismatchException时,扫描仪将不会传递导致异常的令牌,以便可以通过其他方法检索或跳过。导致异常一直接被捕获。
验证
下面为测试结果,发现再控制台中输入“ w w”,代码会执行两次,也证明了陷入死循环的原因是因为控制台中的数据没有被读取。一直读取控制台上的“w”,导致一直捕获InputMisMatchException。
现在,捕获完异常后面,增加scan.next();使得“w w”被读取完,发现一共要循环两次,每次读取一个,读取完后,可以重新在控制台输入内容。
解决
可以调用scan.next()或scan.nextlin()方法,使得数据被读取到,读取完上一次输入内容后,可以进行下一输入。