Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java,而在使用scanner时使用无限循环_Java_Loops_Input_While Loop - Fatal编程技术网

Java,而在使用scanner时使用无限循环

Java,而在使用scanner时使用无限循环,java,loops,input,while-loop,Java,Loops,Input,While Loop,我想让用户输入一个字符串和四个整数值,如果用户输入的类型不匹配,我想让程序不断询问用户整数值,如果用户插入了错误的类型,为什么代码总是循环,从不等待用户输入 import java.util.InputMismatchException; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.i

我想让用户输入一个字符串和四个整数值,如果用户输入的类型不匹配,我想让程序不断询问用户整数值,如果用户插入了错误的类型,为什么代码总是循环,从不等待用户输入

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);

}
}

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

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

}
}
检查这个答案

根据oracle文档:

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

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


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

@ScaryWombat我不认为这是该问题的重复,尽管他们的答案相同。可能有一个更好的复制目标…使用一个库来处理这类东西。我可以推荐。很可能是因为你的答案错了。是的,虽然将继续,但用户将输入新信息并继续。