【问题标题】:How to deal with accidental input of a double when using .nextInt() in Java?在 Java 中使用 .nextInt() 时如何处理意外输入双精度数?
【发布时间】:2010-01-27 00:39:23
【问题描述】:

因此,当我的扫描仪期待完整输入时,我正在尝试处理用户输入双精度的可能异常:

boolean go = true;
do {
        System.out.print("Please enter one grade from 0 - 100. To end input, enter a        
        negative integral value.\n");
    try {
            int myInt = scanner.nextInt();
            .
            .
            .
    }
    catch (InputMismatchException e) {
            System.out.println("Oops!! Please enter only integral numbers");
    }
while (go);

这适用于非数字输入(即字母),但如果我输入 3.14 或其他 ASCII 符号(如 -)则无效。在这种情况下,下面的行会重复,直到我终止程序。

Please enter one grade from 0 - 100. To end input, enter a negative integral value.
Oops!! Please enter only integral numbers.

有什么想法吗? :D

回复:我正在使用 System.in 和 java 6。

【问题讨论】:

  • 你能比“我的代码爆炸”更精确一点吗?
  • “爆炸”是什么意思?你有另一个例外吗?
  • 如果用户在scanner.nextInt(); 输入double,并且InputMismatchException 确实会被抛出。你确定你没有在你的代码中做其他事情吗?如果不是,读取的值是什么,是否是输入的双精度值的向下舍入版本?

标签: java exception try-catch


【解决方案1】:

我猜,当你说爆炸时,你的意思是你正在无限循环

Oops!! Please enter only integral numbers

尝试执行以下操作:

try {
  int myInt = scanner.nextInt();
  // …
}
catch (InputMismatchException e) {
  System.out.println("Oops!! Please enter only integral numbers");
  System.out.println(scanner.next() + " was not valid input.");
}

编辑:我发现我最初的猜测是正确的 ;-)

发生这种情况的原因是当 nextInt() 失败时,内部指针不会继续移动,因此每次您可以再次 nextInt 时,它都会在同一个令牌上失败。因此,您需要先清除令牌,这就是我通过打印出无效输入的文本来执行的操作。然后这会导致从输入流中读取一个新令牌。

【讨论】:

    【解决方案2】:

    我尝试了您在上面发布的代码(使用 System.in InputStream),并且按预期双打导致InputMismatchException。你用的是什么输入法,Java是什么版本的?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      • 2018-09-15
      • 1970-01-01
      • 2010-09-16
      • 2011-12-31
      • 1970-01-01
      • 2019-05-22
      相关资源
      最近更新 更多