繁体   English   中英

为什么Scanner#nextInt for for循环继续抛出异常?

[英]Why does Scanner#nextInt inside for loop keep throwing an exception?

我一直在学习JAVA,我对代码有一点疑问:

class apple {
    public static void main(String[] args) {

        int[] num = new int[3];

        Scanner input = new Scanner(System.in);
        for (int i = 0; i < num.length; i++) {

            try {
                num[i] = input.nextInt();
            } catch (Exception e) {
                System.out
                    .println("Invalid number..assigning default value 20");
            num[i] = 20;
            }
        }

        for (int i = 0; i < num.length; i++) {
            System.out.println(num[i]);
        }
    }
}

我编写了一个小程序来处理异常,如果用户输入不是Int抛出异常并分配默认值。 如果我把扫描器语句放在for循环中,它工作正常,但如果我把它带到它之外,它会分配抛出异常的相同值,即我输入的是char而不是int。 但是如果我输入所有整数,它会在数组中分配正确的值。

Scanner input = new Scanner(System.in);

我希望你们理解我的问题。

Scanner#nextInt如果无法解析整数,则不会超过输入,因此如果在失败后继续调用它,它将继续尝试再次解析相同的输入,抛出InputMismatchException

您可以在catch块中调用Scanner#next ,忽略它返回的字符串,以跳过无效输入:

try {
    num[i] = input.nextInt();
} catch (Exception e) {
    System.out
            .println("Invalid number..assigning default value 20");
    num[i] = 20;
    input.next();
}
        try
        {
            num[i] = input.nextInt();
        }
        catch(InputMismatchException ip)
        {
            System.out.println("Invalid number..assigning default value 20");
            num[i] = 20;
            input.next();
        }

一个更好的代码可以是你可以检查下一个值是否是整数,所以你甚至不需要捕获异常:

   public static void main(String[] args) {

    int[] num = new int[3];

   Scanner input = new Scanner(System.in);  

    for (int i = 0; i < num.length; i++) 
     {
             if(input.hasNextInt())
             {
                  num[i] = input.nextInt();
             }

            else
            {
                System..out.println("non integer value.. will assign it default value 20");
                num[i]=20;
                input.next();
            }
    }

    for (int i = 0; i < num.length; i++) {

        System.out.println(num[i]);
    }


  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM