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

我的循环变成了一个无休止的循环。我该怎么解决呢?我不能在第二个循环中输入一个输入[重复]

汪高岑
2023-03-14
import java.util.InputMismatchException;
import java.util.Scanner;

public class h {

    /** Test Function.
     * @param args Kommandozeilenparameter 
     */
    public static void main(String[] args) {

        Scanner scan = new Scanner(System.in);
        int input;
        boolean check = false;
        do {
            try {
                System.out.println("give me a number: ");

                input = scan.nextInt();

                check = true;
            } catch (InputMismatchException e) {
                System.out.println("Eingabe ist falsch");
            }
        } while (!check);
        System.out.println("getout");
    }
}

我该怎么解决呢?

第二次我什么都写不出来。

共有1个答案

佴淮晨
2023-03-14

当您出现意外行为时,您应该首先处理文档。scan.nextint()仅在输入可以转换为整数时使用该输入。否则,它会把它留在扫描仪的缓冲数据中。因此,如果用户输入了一个字母,那么这个字母永远不会被使用,scan.nextint()只是一遍又一遍地读取同一个字母,因为它不是整数,所以它会一直循环。修复方法是简单地将扫描仪的输入作为字符串读取,不管它是否可以被解释为整数。然后您可以自己检查它是否是整数,输入是否已经被消耗。以下是修改后的示例:

Scanner scan = new Scanner(System.in);
int input;
boolean check = false;

do {
    try {
        System.out.println("give me a number: ");

        // This retrieves the next line of input, without converting it to an integer:
        String line = scan.nextLine();

        // This tries to convert it to an integer,
        // and throws a NumberFormatException if it can't:
        input = Integer.parseInt(line);

        check = true;
    } catch (NumberFormatException e) {
        System.out.println("Eingabe ist falsch");
    }
} while (!check);

System.out.println("getout");

为了帮助您将我的解释可视化,我将写出一个示例输入,然后显示每一步的数据所在位置。假设我使用原始代码在控制台中输入abc。然后程序进入无限循环,原因如下:

我在输入流中输入abc

scan无法将abc转换为整数,因此会引发异常。但是请注意,scan坚持abc,它并不只是消失:

System.in:
扫描:abc
输入:

同样的事情再次发生,它试图将abc转换为整数,但不能,因此它再次抛出异常。看到无限循环发生了吗?

System.in:abc
扫描:
行:
输入:

scan从输入流中读取abc,因为我告诉它读取下一行:

System.in:
扫描:abc
行:
输入:

代码试图将abc解析为一个整数,但它不能,因此它进入下一个循环迭代。对于循环的每次迭代都是本地的,因此它的旧值会被抛出:

System.in:
扫描:
行:
输入:

我在输入流中输入123

扫描数据传递到,因为它符合一行文本的条件:

System.in:
扫描:
行:123
输入:

代码成功地将123解析为整数,并将其分配给input。没有无限循环,程序已经完成。

 类似资料:
  • 问题内容: 我想做的是请用户输入一些字符串以读入数组,然后要求用户输入该数量的字符串并将其读入数组。当我运行此代码时,它从不要求我在第一个for循环的第一个循环中输入内容,只打印出“字符串#0:字符串#1:”,然后我就可以输入文本了。为什么会这样,我做错了什么? 问题答案: 缓冲。 输入输入数量时,不会在输入缓冲区中占用换行符的位置。在for循环的迭代0中,缓冲区中已经有一行输入,并且可以立即完成

  • 问题在代码的注释中,很抱歉,我认为它更整洁,因为流程很重要,我想。。。 //*这是来自Oracle:(https://docs.oracle.com/javase/6/docs/api/java/util/Scanner.html#hasNextInt()) ”hasNextInt 公共布尔值hasnetint() 如果此扫描仪输入中的下一个标记可以使用nextInt()方法解释为默认基数中的in

  • 我有两个循环。在第一个循环中,我分割字段(分割)。在第二个循环中,我想打印新的字段值。只有0。我想知道循环有什么问题。我没有发现错误。:)我认为问题出在这方面: 我在Windows 7中使用Visual Studio 2013编程。 %lf输出(正确): %f输出(不正确):

  • 如下所示,我要反转数组。但我的代码不管用。这是我的for循环。请看一下。这个for循环正确吗。代码如下。

  • 问题内容: 我试图制作一个采用用户输入的多个名称的,直到插入单词为止,但我不确定如何使用。如何实现呢? 问题答案: