就是说这个我在使用了throw_catch异常之后,编译器应该不在报错,然而使用了之后仍然报错,该问题可以仔细探讨,本文可能有一些出入,如果有疑问欢迎提出,共同探讨;若本文有不当之处,也请批评指正! 对于声明的Scanner对象,命名为input 当输入数字时,使用语句:
a=input.nextInt();
之后对这个nextInt使用throw_catch检查InputMismatchException,然而奇怪的是,检测之后,还会出错:
请输入整型数据。
Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:939)
at java.base/java.util.Scanner.next(Scanner.java:1594)
at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
at exp2.ComputeTime.main(ComputeTime.java:22)
代码如下:
Scanner input=new Scanner(System.in);
while(1)
{
try {
a=input.nextInt();}
catch(java.util.InputMismatchException e)
{
System.err.println("请输入整型数据。");
a=input.nextInt();
}
}
经过调试发现,遇到异常之后,进入到catch语句,然后执行到
a=input.nextInt();
的时候,产生的异常,原因就是额,这个缓冲区的那个异常字符清不下去,然后会一直卡在那个字符上,就一直异常; 查找博客一共有两个解决方法: 清除缓冲区,但是没啥方法,不过可以用
input.nextline();
语句,从下一行开始输入,这个好使了,不卡在那个字符上了。
9.9
请输入整型数据。
或者,不在catch语句里面写
a=input.nextInt();
但是,如果运行这个代码,就会死循环,为啥捏?
Scanner input=new Scanner(System.in);
while(1)
{
try {
a=input.nextInt();}
catch(java.util.InputMismatchException e)
{
System.err.println("请输入整型数据。");
}
}
结果大概是这样:
9.9
请输入整型数据。
请输入整型数据。
请输入整型数据。
请输入整型数据。
请输入整型数据。
请输入整型数据。
请输入整型数据。
请输入整型数据。
请输入整型数据。
因为外面是个循环,用了catch语句之后,就输出那个错误提示不报错,所以回到try块里面,但是同刚才,一遇到那个input就会检测出异常又进入catch块里面了,寄了。然后就死循环。
那么能不能不在catch块里面写nextInt捏?可以,在try块里面声明一个scanner不就行了。。这样的话,每一次的缓冲区都是崭新的。亲测有效! 注: 关于清除缓冲区这件事,c能用flush,java就不清楚了 欢迎批评指正!
|