我有一个关于数据验证和扫描仪的问题。下面的代码检查用户输入。除了整数之外的任何内容都是不允许的,并且要求用户重新输入一个值。我的问题是,只有当扫描仪打开时,代码才有效在 while 循环内声明。如果在外部声明扫描仪,则程序将无限执行。这是为什么?谢谢。
int UserInp;
boolean dataType=false;
while(dataType==false)
{
Scanner sc=new Scanner(System.in);
try
{
System.out.print("\nEnter a number: ");
UserInp=sc.nextInt();
dataType=true;
}
catch(Exception JavaInputMismatch)
{
System.out.println("Option not available.Try again.");
}
}
有趣的问题!
所发生的情况是,扫描程序尝试将非整数转换为整数,但意识到它不能——因此它抛出一个 InputMismatchException。然而,如果翻译成功,它只会前进超过令牌。
这意味着,无效的字符串仍然在输入缓冲区中,并且每次循环并尝试调用时都会导致翻译失败nextInt()
。你从未设定过dataType
为 true,所以你无限循环。
要查看实际效果,您可以抓取 catch 块中的任意内容并将其打印出来:
catch(Exception JavaInputMismatch){
System.out.println( sc.next() );
System.out.println("Option not available.Try again.");
}
事实上,在无效输入后,我们得到以下结果:
Enter a number: hello
hello
Option not available.Try again.
Enter a number:
而且我们不会无限循环。这是因为调用next()
从输入缓冲区中获取值,并将扫描仪的指针推进到该缓冲区中的下一个插槽(现在该插槽为空)。所以nextInt()
在这种情况下将等待输入。
哦,如果你在循环中初始化它工作正常的原因是扫描仪将始终开始读取新的输入;扫描仪不会跨实例共享状态,因此由于重新初始化,上一次迭代缓冲区中的“hello”不会出现在下一次迭代的缓冲区中。
从技术上来说,它仍然在标准输入缓冲区中,但是扫描仪指向该缓冲区的指针超出了无效字符串,因为它将开始读取任何new输入,不是现有的输入。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)