当我运行代码并说输入2.5时,我得到的输出是:
2.5,4次"错误"和5。
这意味着计算机每次都要经过catch语句,而不是每次循环while循环并进入try块时都要求输入。
public static void main(String[] args)
{
Scanner s1 = new Scanner(System.in);
int n = 0;
while(n<5)
{
try
{
int grade = s1.nextInt();
System.out.println(grade);
}
catch(Exception e)
{
System.out.println("error");
}
n++;
}
System.out.println(n);
}
答案 0 :(得分:3)
当您输入&#34; 2.5&#34;时,nextInt()
会消耗2
。由同一nextInt()
扫描的下一件事将是.
,并且nextInt()
无法成功扫描,因此您会收到错误消息。 nextInt()
只能用于扫描int
个数字,如果您想扫描2.5
之类的分数,则需要nextDouble()
。
顺便说一句,异常对象包含有用的信息。如果您这样做,您只是隐藏错误信息:
catch (Exception e) {
System.err.println(error):
}
而是这样做:
catch (Exception e) {
e.printStackTrace();
}
不要混用System.out
和System.err
。 System.out
用于正常的程序输出,但不用于记录,调试,信息,警告,错误或此类消息。这些应该转到System.err
。
答案 1 :(得分:0)
基本上,有一个“光标”指向输入行的下一个字符Scanner
将读取的字符。如果输入行看起来像
bad input
光标在b
之前开始。如果您调用nextInt()
,Scanner
将抛出异常,因为b
不能是整数的开头。 但光标停留在同一个地方。因此,下次拨打nextInt()
时,会再次发生同样的错误。
您需要执行一些“消耗”错误输入的操作,以便光标移动。 {al。'答案中的s1.nextLine()
将消耗整个行的其余部分。
如果输入是
2.5
nextInt()
将抛出异常,因为2.5不是整数。再一次,光标停留在同一个地方,所以错误会不断出现,除非你做了一些事情来消耗2.5
。如果您希望程序实际读取2.5
,则不要使用nextInt()
,因为2.5不是整数。
答案 2 :(得分:0)
根据文件:
如果下一个令牌无法转换为有效的int值,则此方法将抛出InputMismatchException,如下所述。如果翻译成功,扫描仪将超过匹配的输入。
这意味着如果翻译不成功,扫描仪不会超过输入。它不断尝试在每次迭代中翻译.5。
通过在catch语句中添加s1.next()来清除扫描程序中的标记,您可以得到我假设您期望的结果:
public static void main(String[] args)
{
Scanner s1 = new Scanner(System.in);
int n = 0;
while(n<5)
{
try
{
int grade = s1.nextInt();
System.out.println(grade);
}
catch(Exception e)
{
**s1.next();**
System.out.println("error");
}
n++;
}
System.out.println(n);
}
正如许多人已经提到的那样,从异常中输出所有可能的信息!