java的scanner类以及throw_catch异常

就是说这个我在使用了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();
		 // continue;
	  }
	  }

经过调试发现,遇到异常之后,进入到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("请输入整型数据。");
		 // continue;
	  }
	  }

结果大概是这样:

9.9
请输入整型数据。
请输入整型数据。
请输入整型数据。
请输入整型数据。
请输入整型数据。
请输入整型数据。
请输入整型数据。
请输入整型数据。
请输入整型数据。

因为外面是个循环,用了catch语句之后,就输出那个错误提示不报错,所以回到try块里面,但是同刚才,一遇到那个input就会检测出异常又进入catch块里面了,寄了。然后就死循环。

那么能不能不在catch块里面写nextInt捏?可以,在try块里面声明一个scanner不就行了。。这样的话,每一次的缓冲区都是崭新的。亲测有效!
注:
关于清除缓冲区这件事,c能用flush,java就不清楚了
欢迎批评指正!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的自定义Scanner的示例代码: ```java import java.io.InputStream; import java.util.InputMismatchException; import java.util.Scanner; public class CustomScanner { private InputStream inputStream; private StringBuilder buffer; public CustomScanner(InputStream inputStream) { this.inputStream = inputStream; this.buffer = new StringBuilder(); } public String next() { clearBuffer(); int c = read(); while (isWhiteSpace(c)) { c = read(); } while (!isWhiteSpace(c)) { buffer.append((char) c); c = read(); } return buffer.toString(); } public int nextInt() { try { return Integer.parseInt(next()); } catch (NumberFormatException e) { throw new InputMismatchException(); } } private void clearBuffer() { buffer.setLength(0); } private boolean isWhiteSpace(int c) { return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1; } private int read() { try { int c = inputStream.read(); return c; } catch (Exception e) { throw new InputMismatchException(); } } } ``` 这个自定义Scanner包含了两个方法:`next()`和`nextInt()`。`next()`方法读取输入流中的下一个字符串,`nextInt()`方法读取输入流中的下一个整数。如果读取的字符串无法转换成整数,`nextInt()`方法会抛出一个`InputMismatchException`异常。 这个自定义Scanner的实现方式与Java标准库中的`Scanner`不同,它使用了字符流而不是字节流,并且没有使用正则表达式。因此,它的性能可能比Java标准库中的`Scanner`差一些。但是,它可以作为一个基础的自定义Scanner的示例,供你参考和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值