【问题标题】:How do I ensure that Scanner hasNextInt() asks for new input?如何确保 Scanner hasNextInt() 要求新输入?
【发布时间】:2014-11-15 18:16:37
【问题描述】:

这里是新程序员。这可能是一个非常基本的问题,但它仍然困扰着我。

我要做的是编写一种只提供一个整数输入的方法,这样我就可以在我的主程序中使用该输入,而不必乱用非整数输入。但是,即使在自己的方法中编写方法来执行此操作似乎也有问题。

public static int goodInput () {
    Scanner input = new Scanner (System.in); //construct scanner
    boolean test = input.hasNextInt(); //set a sentinel value
    while (test == false) { //enter a loop until I actually get an integer
        System.out.println("Integers only please"); //tell user to give me an integer
        test = input.hasNextInt(); //get new input, see if it's an integer
    }
    int finalInput = input.nextInt(); //once i have an integer, set it to a variable
    input.close(); //closing scanner
    return finalInput; //return my integer so I don't have to mess around with hasNextInt over there
}

这似乎在多个层次上被打破,但我不太确定为什么。

如果我在第一次被要求输入时输入像 0 或 1 这样的整数值,它应该完全跳过循环。但是,相反,它进入循环,并打印“请仅使用整数”。更糟糕的是,当我在那里时,它实际上并没有要求输入,只是重复打印该行。

我知道后一个问题可能是由于令牌问题,但我不一定确定如何解决它们;关闭然后重新打开扫描仪让 Eclipse 对“重复对象”进行错误处理,只需将旧输入分配给一个从未使用过的垃圾字符串变量,告诉我在运行时“未找到任何行”,而我经验不足想其他方法来获得新的意见。

即使解决了,我也需要找到一些方法来避免在有整数的情况下进入循环。我真的不明白为什么要在循环中输入整数,所以我不确定这怎么可能。

请帮忙?对不起,如果这是一个老问题;尝试查看过去的问题,但似乎没有一个问题与我有相同的问题。

【问题讨论】:

  • input.nextInt(); 将要求新的输入。 input.hasNextInt(); 将检查下一个输入是否可用,并相应地返回真或假!
  • @shekharsuman:那么有什么方法可以获取输入,不对输入可能是什么类型做出任何假设,检查输入是否为 int,如果不重复?如果我只是在我的实际循环中使用 input.nextInt() 并且进行了非 int 输入,那么我相信代码就会中断。

标签: java input token java.util.scanner


【解决方案1】:
//while (test == false) {                         // Line #1
while (!test) { /* Better notation */             // Line #2
    System.out.println("Integers only please");   // Line #3
    test = input.hasNextInt();                    // Line #4
}                                                 // Line #5

问题是在上面的第 4 行中,input.hasNextInt() 只测试是否输入了一个整数,而不要求输入一个新的整数。如果用户输入的内容其他不是整数,hasNextInt() 将返回false 并且您不能请求nextInt(),因为随后会抛出InputMismatchException,因为Scanner 仍在等待一个整数。

您必须使用next() 而不是nextInt()

while (!input.hasNextInt()) {
    input.next();
    // That will 'consume' the result, but doesn't use it.
}
int result = input.nextInt();
input.close();
return result;

【讨论】:

    【解决方案2】:

    你很亲密:这对我来说很好:

    Scanner input = new Scanner(System.in); //construct scanner
    while(!input.hasNextInt()) {
        input.next(); // next input is not an int, so consume it and move on
    }
    int finalInput = input.nextInt();
    input.close(); //closing scanner
    System.out.println("finalInput: " + finalInput);
    

    通过在 while 循环中调用 input.next(),您可以使用非整数内容并再次尝试,直到下一个输入是 int。

    【讨论】:

    • +1,好!我打算添加这种方法,但幸运的是不再看到你的答案......
    • 这也给我带来了一些问题!当我重写我的代码(使用 input.next() 而不是修改我的布尔值)时,执行它仍然会在不应该进入循环时进入循环并创建几个异常:java.util.NoSuchElementException、java.util.Scanner.throwFor 和java.util.Scanner.next.
    • 使用此代码,控制台等待输入。如果我输入一个非整数值并按回车键,它只会开始一个新行并等待更多输入。只要我输入一个整数值并按 Enter,程序就会输出整数值并停止执行。当您单独运行此代码(不将其包含在较大的代码项目中)时,您会看到什么?
    • 使用您自己的代码完全可以正常工作,但是将我的第 3-7 行更改为您的 2-4(但包括我的打印)则不行。
    • 这表明您在代码项目的其他地方存在问题。 (您的一些例外以不同的方法暗示了问题。)您可能需要隔离这些问题的根源,如果您无法找出原因,请提出一个新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多