如下代码,用来求阶乘
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文档里:
因为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;
}
}
如下图:
这时控制台输入错误,就不会陷入死循环了