JAVA Scanner类的nextInt方法接收到非法输入问题

如下代码,用来求阶乘

try{}catch{}里对nextInt()方法进行了异常捕获

package task;
import java.util.InputMismatchException;
import java.util.Scanner;
public class task2 {
	public static void main(String[] args) {
     Scanner input=new Scanner(System.in);
     int num = 0;
     //while循环接受非负正整数的输入,直到输入正确,跳出循环。
       while(true){
    	   System.out.println("请输入一个非负正整数:");
    	   try{
    		   num=input.nextInt();
    		   if(num>0)//判断是否为非负正整数
        		   break;
    	   }
    	   catch(InputMismatchException e){//捕获输入异常
    		  System.out.println("输入异常:"+e.toString());
    	   }
       }
       //关闭文本输入程序,释放资源
       input.close();
       //调用求阶乘的静态方法,并将其结果输出在控制台
       System.out.println(num+"!="+fac(num));
	}
//求阶乘的方法
	public static long fac(int n){
		long f;
		if(n==1)
			f=1;
		else
			f=n*fac(n-1);
		return f;
	}
}

但是,如果控制台输入错误,却一直循环输出:

请输入一个非负正整数:
a
请输入一个非负正整数:
输入异常:java.util.InputMismatchException
请输入一个非负正整数:
输入异常:java.util.InputMismatchException

请输入一个非负正整数:
输入异常:java.util.InputMismatchException

...........

原因是:nextInt()方法只能接受整型数据,如果输入非整型,就会有异常,就不会读取文本缓冲区的内容,文本缓冲区的内容就不会消失,即使下次再调用nextInt()方法,因为文本缓冲区的内容还是上次的内容,异常继续发生,依次循环。

解决办法:

在catch里加上个input.next();即可

Scanner类里的next()方法在jdk文档里:

    • String next()

      查找并返回此扫描仪的下一个完整标记。

因为next()方法可以接受字符串,调用此方法后,就会读取文本缓冲区的内容并以字符串返回,相当于把文本缓冲区清空了。

修改后代码:

package task;
import java.util.InputMismatchException;
import java.util.Scanner;
public class task2 {
	public static void main(String[] args) {
     Scanner input=new Scanner(System.in);
     int num = 0;
     //while循环接受非负正整数的输入,直到输入正确,跳出循环。
       while(true){
    	   System.out.println("请输入一个非负正整数:");
    	   try{
    		   num=input.nextInt();
    		   if(num>0)//判断是否为非负正整数
        		   break;
    	   }
    	   catch(InputMismatchException e){//捕获输入异常
    		  System.out.println("输入异常:"+e.toString());
    		  input.next();//读取下一个值
    	   }
       }
       //关闭文本输入程序,释放资源
       input.close();
       //调用求阶乘的静态方法,并将其结果输出在控制台
       System.out.println(num+"!="+fac(num));
	}
//求阶乘的方法
	public static long fac(int n){
		long f;
		if(n==1)
			f=1;
		else
			f=n*fac(n-1);
		return f;
	}
}

如下图:

这时控制台输入错误,就不会陷入死循环了

运行截图

猜你喜欢

转载自blog.csdn.net/cc1969281777/article/details/82527916