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

“hasNextInt”不检测后续输入;“下一行”放在哪里?

邹宣
2023-03-14

我是Java的新手,这一次把我甩了。使用下面的代码循环第一个问题,直到我输入除整数以外的任何内容,但循环结束后,它不会停止处理剩余的问题。

通过一些研究和阅读,我发现我需要使用in.nextLine()来读取输入后的换行符。但是,无论我将nextLine()放置在何处,它都无法工作?我以为它会在第一个int input=in.nextInt()之后;但这行不通。有没有关于它会去哪里以及为什么的帮助?

System.out.print("How many CUs per course are remaining in your degree program? Enter any letter to quit: ");
while (in.hasNextInt()) { // Verify input is an integer
    int input = in.nextInt();
    if (input <= 0) // Verify that input is not negative or zero
    {
        System.out.println("Please enter a positive number or any letter to quit");
        System.out.print("Add another course or any letter to quit: ");
    } else {
        courseCuList.add(input);
        System.out.print("Add another course or any letter to quit: ");
    }
}
System.out.print("How many CUs do you plan to take per term?");
while (in.hasNextInt()) {
    int input = in.nextInt();
    // in.nextLine(); This line consumes the \n
    if (input <= 0) {
        System.out.println("Please enter a whole positive number.");
        System.out.println("How many CUs do you plan to take per term?");
    } else {
        cuPerTerm = in.nextInt();
    }
}

共有2个答案

东门令
2023-03-14

你需要读两遍。

while循环的退出条件是hasNextInt()-检查下一个标记是否为整数实际上并不会清除该标记,这意味着下一个nextLine()将读取该标记,随后的nextLine()将读取换行符。

要演示这一点,请在回路之间放置以下各项:

System.out.println(in.nextLine() + " | " + in.nextLine());

对于输入4,4,A,您将看到输出:

How many CUs per course are remaining in your degree program? Enter any letter to quit: 4
Add another course or any letter to quit: 4
Add another course or any letter to quit: A
 | A
How many CUs do you plan to take per term?

有两个令牌需要从缓冲区中清除,它们都不是整数。正因为如此,无论你把nextLine()放在哪里,它都会失败——你需要插入两次。如果只插入一次,下一个标记将不是整数,并且当程序试图进入第二个循环时,hasNextInt()将失败。

为了使程序正常工作,只需插入:

in.nextLine(); in.nextLine();

在第二个循环之前。(请注意,您不应同时输入此内容和打印输出,因为这将读取四次。)

邴和雅
2023-03-14

您的问题是,在while(in.hasNextInt())中,hasNextInt的每个调用都需要等待用户输入,然后测试它是否为整数。

因此,每次用户给出整数时,条件将被计算为ture,循环将执行,条件将需要再次检查,如果是整数,循环将再次执行。这将一次又一次地进行,直到hasNextInt能够返回false,例如当用户将给出非整数类字母时。但是在这种情况下,下一个循环中的条件也将返回false,因为这个非整数值在第一个循环后没有被消耗。要让第二个循环工作,您需要调用nextLine两次

  1. 要在先前输入正确的整数后使用行分隔符

但是,如果用户不将任何整数放在非整数值之前,这也可能失败,因为没有行分隔符可以使用。

所以考虑把你的逻辑转换成类似于

boolean iterateAgain = true;
System.out.print("give me positive number: ");
while (iterateAgain) {
    // this inner loop will move on only after getting integer
    while (!in.hasNextInt()) {//here program waits for user input
        in.nextLine();// consume non-integer values
        System.out.print("that wasn't positive number, try again: ");
    }
    int number = in.nextInt();// now there must be number here
    in.nextLine();// consume line separator
    if (number > 0) {
        System.out.println("you gave " + number);
        // do what you want with this number
        iterateAgain = false;// we can leave loop
    } else
        System.out.print("that wasn't positive number, try again: ");
}

如果您想执行下一个循环,那么您所需要的就是将iterate再次值重置为true

 类似资料:
  • 我在爪哇是全新的,这一个把我扔了。使用下面的代码,它对第一个问题进行循环,直到我输入除整数以外的任何内容,但在完成循环后,它不会对剩余的问题停止。 通过一些研究和阅读,我发现我需要使用in.nextline()在输入后使用换行符。但是,无论我把nextLine()放在哪里,它都不起作用?我认为应该在第一个int input=in.nextint()之后;但那不起作用。关于它会去哪里以及为什么要去,

  • 我怎样才能使它出现而不必按回车键?!

  • 问题内容: 我有一个JComboBox的子类。我尝试使用以下代码添加一个键侦听器。 但是,这不能正确检测用户何时按下一个键。实际上根本没有调用它。我添加的这个监听器是否错误?还有其他添加方式吗? 问题答案: 关键事件不是在框本身上触发的,而是在其编辑器上触发的。您需要将keyListener添加到JComboBox的编辑器中,而不是直接添加到框中: 编辑:固定方法调用。

  • 问题内容: 在事件上使用jquery时,仅当输入失去焦点时才会触发事件 就我而言,我需要在输入值更改后立即调用该服务(检查值是否有效)。我该怎么做? 问题答案: 更新为澄清和示例 方法1。事件 在现代浏览器中使用事件。当用户在任何时候将值从一个值更改为另一个值时,都将在用户键入文本字段,粘贴,撤消操作时触发此事件。 在jQuery中这样做 从jQuery 1.7开始,替换为: 方法2。事件 对于较

  • 问题内容: 这里是新程序员。这可能是一个非常基本的问题,但这仍然让我感到困扰。 我想做的是编写一种方法,该方法仅提供一个整数输入,因此我可以在主程序中使用该输入,而不必弄乱非整数输入。但是,即使编写使用自己的方法来执行此操作的方法似乎也是有问题的。 这似乎在多个层面上都被打破了,但我不确定为什么。 如果我在首次输入时输入了0或1之类的整数值,则应该完全跳过循环。但是,相反,它进入了循环,并打印“请

  • 我在test1.php输入表单,我想检查数据库中的用户输入,如果用户输入不存在于数据库中,它将test2.php并在test2.php.回声用户输入,重定向回到test1.php和回声,不可用。 现在,如果输入存在于sql中,我可以重定向回上一页,但无法在test2中回显用户输入。关闭连接后返回php。 这里是test1.php 这里是testexec。php 这里是test2。php