繁体   English   中英

Java,使用扫描仪时无限循环

[英]Java, while infinite loop when using 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) {
            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);

}
}

在检查来自用户的正确输入时,我总是使用 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);

可怕的袋熊对您的问题的评论是正确的。 我用他的评论对上面的代码进行了编码。

我实际上解决了它,我只需要在下面的catch语句中添加一个(scanner.next();),这是因为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

根据扫描仪 oracle 文档: https : //docs.oracle.com/javase/7/docs/api/java/util/Scanner.html

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

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

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

因为你没有break; 在 catch 块中。 出现异常时,打印消息。 但是一旦它从catch块中出来,while循环仍然满足其条件并再次执行。 尝试添加break; 也在 catch 块内。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM