防止扫描程序读取Java中的剩余输入

时间:2017-02-08 04:44:33

标签: java java.util.scanner

我想知道如何阻止扫描仪从用户那里读取额外的错误输入。

例如,我想将用户输入2 one作为2读入变量diam,以下程序实现。

问题是,下一个循环会自动检测输入中的one剩余,并相应地执行if语句。

我能够通过创建两个扫描仪来解决这个问题,但不幸的是,这个特定的任务不允许这样做。此外,我们还需要在我们的计划中使用.hasNextInt()

如何防止这种"溢出"只使用一台扫描仪?我不得不假设这个问题已经提出过,但我没有太多运气找到答案。

    Scanner scnr = new Scanner(System.in);

    System.out.print("Enter the diameter of a "
            + "cylinder (in centimeters): ");
    // BEGIN: diameter input verification loop      
    for (;;) {
        if (!scnr.hasNextInt()) {
            System.out.print("Please enter an integer value "
                    + "(less than 2,147,483,648) as decimal digits: ");
            scnr.nextLine(); 
            continue;
        }
        diam = scnr.nextInt();
        if (diam >= 0) {
           //null statement
        } 
        else {
          System.out.print("Please enter a positive integer value: ");
          continue;
        }
    break;
    }
    //END: diameter input verification loop

    //prompts user for container height     
    System.out.print("Enter the height of a "
            + "cylinder (in centimeters): ");

    // BEGIN: height input verification loop        
    for (;;) {
        if (!scnr.hasNextInt()) {
            System.out.print("Please enter an integer value "
                    + "(less than 2,147,483,648) as decimal digits: ");
            scnr.nextLine(); 
            continue;
        }
        height = scnr.nextInt();
        if (height >= 0) {
           //null statement
        } 
        else {
          System.out.print("Please enter a positive integer value: ");
          continue;
        }
    break;
    }
    //END: height input verification loop`

3 个答案:

答案 0 :(得分:2)

一种选择是只读取Scanner的整行输入,然后只保留第一个单词。例如,对于圆柱体的直径,您可以使用:

System.out.print("Enter the diameter of a cylinder (in centimeters): ");
String input = scnr.nextLine();
try {
    int diam = Integer.parseInt(input.split(" ")[0]);
}
catch (NumberFormatException e) {
    System.out.print("Please enter an integer value "
                + "(less than 2,147,483,648) as decimal digits: ");
}

答案 1 :(得分:1)

我可以想到几种方法:

  • Tim指出,您可以使用readLine()从用户那里读取完整的一行,然后解析该行。您可以使用split,或创建新的扫描程序来解析该行或其他各种方法。

  • 您可以坚持使用一个Scanner并调用nextLine()来丢弃未使用的字符,直至并包括下一行结尾。显然,你需要在调用nextInt()之后执行此操作。例如:

    height = -1;
    while (height < 0) {
        if (!scnr.hasNextInt()) {
            System.out.print("Please enter an integer value "
                    + "(less than 2,147,483,648) as decimal digits: ");
        } else {
            height = scnr.nextInt();
            if (height < 0) {
               System.out.print("Please enter a positive integer value: ");
            }
        }
        scanner.nextLine();
    }
    

    (上面的代码版本重组了一些内容,以摆脱breakcontinue。重组也允许我将readLine作为循环的无条件最后语句。我认为它使逻辑更容易理解......)

答案 2 :(得分:1)

// BEGIN: height input verification loop
        for (;;) {

            scnr.nextLine(); /* read fresh input, deleting the left over input */

            if (!scnr.hasNextInt()) {
                System.out.print("Please enter an integer value " + "(less than 2,147,483,648) as decimal digits: ");
                scnr.nextLine();
                continue;
            }
            height = scnr.nextInt();
            if (height >= 0) {
                // null statement
            } else {
                System.out.print("Please enter a positive integer value: ");
                continue;
            }
            break;
        }

您只需添加scnr.nextLine()即可删除之前输入中剩余的“旧”scnr。这解决了溢出问题。