当前位置: 首页 > 知识库问答 >
问题:

为什么Scanner#nextInt inside for loop不断引发异常?

冉伯寅
2023-03-14

我一直在学习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,则抛出异常并分配默认值。如果我将扫描仪语句放入循环中,它可以正常工作,但如果我将其置于其外部,则分配抛出异常的相同值,即我输入的是char而不是int。但如果我输入所有整数,它会在数组中分配正确的值。

Scanner input = new Scanner(System.in);

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

共有3个答案

楚浩然
2023-03-14

更好的代码是,您可以检查下一个值是否为整数,因此您甚至不需要捕捉异常:

   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]);
    }


  }
墨安阳
2023-03-14
        try
        {
            num[i] = input.nextInt();
        }
        catch(InputMismatchException ip)
        {
            System.out.println("Invalid number..assigning default value 20");
            num[i] = 20;
            input.next();
        }
东门宜
2023-03-14

如果扫描程序#nextInt无法解析整数,则它不会超越输入,因此如果您在失败后继续调用它,它将继续尝试再次解析相同的输入,引发输入不匹配异常。

您可以在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();
}
 类似资料:
  • 问题内容: 我遇到了一个问题,即使它可以与他人正常工作,也无法使java.util.Scanner读取保存在记事本中的文本文件。基本上,当它尝试读取问题文件时,它完全是空手的- hasNextLine()为false,缓冲区为空,等等。我将其范围缩小到一个事实,即如果存在,它甚至不会读取第一行是文件中 任何地方 的卷曲报价。没有异常被抛出。请注意,同一文件上的BufferedReader没问题。

  • 问题内容: 我想输入2个数字,一个int是要提取的金额,一个double是余额(它们之间有一个空格)。由于每次提款都收取0.5的手续费,因此余额必须加倍。那就是必须打印的内容。我在nextDouble上收到错误,为什么?我只有1个月的编码,我认为这将是小菜一碟,我认为BASIC语法在30年前毁了我:( 问题答案: 它取决于语言环境,请尝试使用逗号而不是点,反之亦然。 例如: 1.5 而不是 1.5

  • 问题内容: 有什么不同之处与使得迭代器不会引发异常而引发异常?最后,两者都在修改集合大小。 请在这里忽略多线程。我只是在谈论一个for-each循环和一个迭代器循环。据我所知,for-each循环仅在内部创建迭代器。 我很困惑。 问题答案: 不会抛出,因为这是在迭代时修改集合的 允许 方式。这是什么的Javadoc的说: 从基础集合中移除此迭代器返回的最后一个元素(可选操作)。每次调用next()

  • 问题内容: 需要对以下代码进行澄清: 这将打印出来,以便证明和对象引用相同的内存引用。 这将打印出来,也证明是相同的。 显然,这将引发,因为我试图调用空引用。 所以这是我的问题,为什么最后一个代码示例没有抛出,因为我从前两个示例中看到并理解的是,如果两个对象都引用同一个对象,那么如果我们更改任何值,那么它也会反映给另一个对象,因为两个对象都指向相同的内存引用。那么,为什么该规则在这里不适用?如果我

  • 为什么这段代码不抛出?看一看: 我不知道!

  • 问题内容: 在Java中: 抛出。为什么?为什么在这里投降?我不知道原因。 问题答案: 让我重命名您的班级,以使事情更加清楚。 -> 。 -> 。 仅仅因为你是一个人并不意味着你是一个人。你可能是一个。这就是将A强制转换为A的原因。 另一方面,每个是吗?答案是“是”。这就是为什么您 可以 编写如下代码: 要么 另外值得注意的是,您 可以 执行以下操作: 这样做的原因是您的变量实际上是在引用实例。因