循环做...虽然不确定

时间:2014-03-08 22:18:03

标签: java infinite-loop do-while inputmismatchexception

在catch块中,我正在尝试纠正用户输入错误的问题。在测试它时,如果我使用“break”关键字,它不会跳转到最初的问题。如果我使用“继续”,它会无限循环。 “Sc.next();”似乎也没有解决它。

这是代码的相关部分。

public class ComputerAge {
    private static int age;
    private static int year;
    private static int month;
    private static int date;
    private static Calendar birthdate;

    static Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
        System.out.print("Enter the numeral representing your birth month: ");
        do {
            try {
                month = sc.nextInt();
            } catch (InputMismatchException ime){
                System.out.println("Your respone must be a whole number");
                break;
            }
        } while (!sc.hasNextInt());

5 个答案:

答案 0 :(得分:3)

您的方法存在的问题是,当您致电sc.nextInt()并引发异常时,Scanner 提升其阅读位置。您需要通过调用sc.next()块内的catch而不是break来推进阅读指针:

do {
    try {
        month = sc.nextInt();
    } catch (InputMismatchException ime){
        System.out.println("Your respone must be a whole number");
        sc.next(); // This will advance the reading position
    }
} while (!sc.hasNextInt());

答案 1 :(得分:3)

为了解决问题,我们应该确定最终要完成的目标 我们希望月份是数字月份,即数字> 0

<强>因此:

  • 如果用户填写正确的号码month将被填写。
  • 否则,将抛出异常,month将保持为'0'。

结论:我们希望我们的程序在月份等于0时继续运行。

解决方案非常简单:

条件应该是:

while (month == 0);

您应该将break更改为sc.next()

答案 2 :(得分:2)

我认为你应该使用无限循环,当输入正确时(没有抛出异常),使用break完成循环:

public static void main(String args[])
{
    System.out.print("Enter the numeral representing your birth month: ");
    do {
        try {
            int month = sc.nextInt();
            break;
        } catch (InputMismatchException ime) {
            System.out.println("Your respone must be a whole number");
            sc.nextLine();
        }
    } while (true);
}

此外,您必须在sc.nextLine()块中使用catch,因为当您输入一些输入并按 Enter 时,会添加换行符,并且{ {1}}不读它。您必须使用nextInt()来使用该字符。有关此问题的更多信息you could read this

答案 3 :(得分:2)

首先,你必须避免在迭代句中使用try / catch来提高性能。

你可以通过这种方式重新编码休息时间(请记住de do-while至少会执行一次,所以如果你的扫描程序检索空值,你将拥有nullPointer)

    try {
       while (sc != null && !sc.hasNextInt()) {
            month = sc.nextInt();
        } 
    } catch (InputMismatchException ime){
            System.out.println("Your respone must be a whole number");
    }

答案 4 :(得分:1)

确保您可以先获取整数,然后使用正则表达式。如果可能,请不要使用异常来强制执行代码逻辑。

int month;
boolean correct = false;
while (!correct && sc.hasNextLine())
{
    String line = sc.nextLine();
    if (!line.matches("^[0-9]+$"))
    {
        System.out.println("Your response must be a whole number");
        correct = false;
    }
    else
    {
        month = Integer.parseInt(line);
        correct = true;
    }
}