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

Java,而使用扫描器时无限循环

郎子平
2023-03-14

我想让用户输入一个String和四个整数值,如果用户输入的类型不匹配,我想让程序继续要求用户输入整数值,为什么代码会一直循环,如果用户插入了错误的类型,永远不会等待用户输入?

import java.util.InputMismatchException;
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    String sessionName;
    int pomoInterv, breakInterv, terminalBreakInterv;
    System.out.println("Please, Enter the session name: ");
    sessionName = scanner.nextLine();
    while (true) {
        try {
            System.out.println("Please, Enter the Pomodoro interval: ");
            pomoInterv = scanner.nextInt();
            break;
        } catch (InputMismatchException ex) {
            System.out.println(ex.getMessage());
        }

    }
    while (true) {
        try {
            System.out.println("Please, Enter the break interval: ");
            breakInterv = scanner.nextInt();
            break;
        } catch (InputMismatchException ex) {
            System.out.println(ex.getMessage());
        }

    }
    while (true){
        try {
            System.out.println("Please, Enter the terminal break interval ");
            terminalBreakInterv = scanner.nextInt();
            break;
        } catch (InputMismatchException ex) {
            System.out.println(ex.getMessage());
        }
    }
    System.out.println("Done!");
    System.out.println(sessionName);
    System.out.println(pomoInterv);
    System.out.println(breakInterv);
    System.out.println(terminalBreakInterv);

}
}

共有3个答案

颛孙玉石
2023-03-14

我其实解决了,我只要加一个(scanner . next();)在下面的catch语句中,是因为Scanner类是如何工作的,参见下面的代码,

import java.util.InputMismatchException;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    String sessionName;
    int pomoInterv, breakInterv, terminalBreakInterv;
    System.out.println("Please, Enter the session name: ");
    sessionName = scanner.nextLine();
    while (true) {
        try {
            System.out.println("Please, Enter the Pomodoro interval: ");
            pomoInterv = scanner.nextInt();
            break;
        } catch (InputMismatchException ex) {
            scanner.next();
            System.out.println(ex.getMessage());
        }

    }
    while (true) {
        try {
            System.out.println("Please, Enter the break interval: ");
            breakInterv = scanner.nextInt();
            break;
        } catch (InputMismatchException ex) {
            scanner.next();
            System.out.println(ex.getMessage());
        }

    }
    while (true){
        try {
            System.out.println("Please, Enter the terminal break interval ");
            terminalBreakInterv = scanner.nextInt();
            break;
        } catch (InputMismatchException ex) {
            scanner.next();
            System.out.println(ex.getMessage());
        }
    }
    System.out.println("Done!");
    System.out.println(sessionName);
    System.out.println(pomoInterv);
    System.out.println(breakInterv);
    System.out.println(terminalBreakInterv);

}
}

检查这个答案https://stackoverflow.com/a/47852703/12565862

裴俊能
2023-03-14

当检查用户输入是否正确时,我总是使用do-while循环。

看看以下是否有效:

    Scanner scanner = new Scanner(System.in);
    String sessionName;
    int pomoInterv = -1, breakInterv = -1, terminalBreakInterv = -1;
    System.out.println("Please, Enter the session name: ");
    sessionName = scanner.nextLine();
    boolean isPomoInterv = false;
    do {
        System.out.println("Please, Enter the Pomodoro interval: ");
        String temp = scanner.nextLine();
        try {
            if (Integer.parseInt(temp) > 0) {
                pomoInterv = Integer.parseInt(temp);
                isPomoInterv = true;
            }
        } catch (NumberFormatException e) {
            System.out.println("Try again");
        }

    } while (!isPomoInterv);

    boolean isBreakInterv = false;
    do {
        System.out.println("Please, Enter the break interval: ");
        String temp = scanner.nextLine();
        try {
            if (Integer.parseInt(temp) > 0) {
                breakInterv = Integer.parseInt(temp);
                isBreakInterv = true;
            }
        } catch (NumberFormatException e) {
            System.out.println("Try again");
        }

    } while (!isBreakInterv);

    boolean isTerminalBreakInterv = false;
    do {
        System.out.println("Please, Enter the terminal break interval ");
        String temp = scanner.nextLine();
        try {
            if (Integer.parseInt(temp) > 0) {
                terminalBreakInterv = Integer.parseInt(temp);
                isTerminalBreakInterv = true;
            }
        } catch (NumberFormatException e) {
            System.out.println("Try again");
        }

    } while (!isTerminalBreakInterv);

    System.out.println("Done!");
    System.out.println(sessionName);
    System.out.println(pomoInterv);
    System.out.println(breakInterv);
    System.out.println(terminalBreakInterv);

惊吓袋熊对你的问题的评论是正确的。我用他的评论编写了上面的代码。

吕鸿文
2023-03-14

根据扫描仪Oracle docs:https://docs . Oracle . com/javase/7/docs/API/Java/util/scanner . html" target="_blank">html

当扫描仪抛出InputMismatchException时,扫描仪不会传递导致异常的令牌,因此可以通过其他方法检索或跳过它。

因此,当您输入整数以外的任何内容时,scanner.nextInt()不会将其解析为整数并抛出InputMismatchException,并且扫描仪不会移动到下一个标记并一次又一次地尝试读取相同的标记。

要解决这个问题,您可以更改循环,或者使用hasNextInt()方法,或者在catch块中使用scanner.next(),以便扫描器可以移动到下一个标记。

 类似资料:
  • 问题内容: boolean z = false; do { try { a = sc.nextInt(); z = true; } catch(Exception e) { } } while(!z); 试试这个。如果您第一次尝试整数,则整数将正确执行。但是,如果您输入错误的文本类型,即使您接下来输入int并跳过将布尔值分配为true的情况,也会变成无限循环。为什么是这样? 问题答案: 您的问题出

  • 正如使用boto3完全扫描dynamoDb中所解释的,我构建了一个解决方案,使用某些条件完全扫描dynamoDb表。这是我的代码: 但是当代码被执行时,它会进入一个无限循环。这是LastEvaluatedKey每次迭代的输出: 它一直在这两对之间循环。 编辑: 我添加了do_scan方法。

  • 嗨,我正在编写一个程序,它使用Scanner从用户那里获取输入,然后使用布尔方法检查输入的长度是否不超过六个字符。问题是,如果长度小于六个,我使用了while循环来不断请求输入;但是在第一次错误输入后,如果你插入一串六个字母或更长的字符串,循环仍然会继续。这是程序: 谢谢

  • 我正在尝试编写使用Scanner类从用户那里获取输入的代码。但是hasNext()、hasNextInt()和hasNextLine()每次都会运行无限循环。

  • 所以,我被这段代码困住了: 这是我的输出: 插入一个整数:< br >无效值!< br >插入一个整数:< br >无效值!< br >...