循环中的Java catch语句不起作用

时间:2014-11-25 18:05:17

标签: java try-catch

当我运行代码并说输入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);
}

3 个答案:

答案 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.outSystem.errSystem.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);
}

正如许多人已经提到的那样,从异常中输出所有可能的信息!