在 while 循环中尝试阻止在第二次迭代时不执行

Try block in while loop doesnt execute on second iteration

嗨,我是编程新手,我遇到了这个问题。我想使用扫描仪从用户那里获取输入。程序应该尝试输入是否有效,然后调用一个函数来完成这项工作。问题是如果输入无效,我希望程序重复请求用户输入。所以我在 while 循环中尝试块。问题是在 while 循环的第一次迭代中一切正常,但是当我插入无效输入并且 while 循环被迫第二次迭代时,try 块没有被执行,并且 while 循环的条件 boolean 没有设置为 false。所以 while 循环永远运行。请善待。

public static void main(String args[]) {
    Scanner scanner = new Scanner(System.in);
    boolean isRunning = true;
    int input;

    while(isRunning) {
        System.out.println("insert a number:");
        try {
            input = scanner.nextInt();
            inputToString(input);
            isRunning = false;
        } catch(InputMismatchException e) {
            System.out.println("input musi byt cele cislo");
            isRunning = true;
        }

    }
}

public static void inputToString(int input) {
    System.out.println(input);
} 

您的方法的问题在于,当输入无效时 int 您将其留在输入缓冲区中。下一个循环将看到完全相同的输入,并且会重复完全相同的动作(抛出、接住、继续循环)。

你应该做的是当你发现它与你的期望不匹配时,从扫描器中删除不正确的输入。您可以在 catch 块中执行此操作,如下所示:

try {
    input = scanner.nextInt();
    inputToString(input);
    isRunning = false;
} catch(InputMismatchException e) {
    System.out.println("input musi byt cele cislo");
    isRunning = true;
    scanner.nextLine(); // Drop input from the scanner's buffer
}

更好的方法是在扫描代码中完全不依赖 try/catchScanner为您提供了一种避免异常的便捷方式:在调用nextInt之前先调用hasNextInt可以让您提前知道是否会抛出异常,并清理错误数据来自缓冲区:

while(isRunning) {
    System.out.println("insert a number:");
    if (scanner.hasNextInt()) {
        input = scanner.nextInt();
        inputToString(input);
        isRunning = false;
    } else {
        System.out.println("input musi byt cele cislo");
        isRunning = true;
        scanner.nextLine(); // Drop input from the scanner's buffer
    }
}

您需要在请求新号码之前从扫描仪中使用无效号码,因为 nextInt 没有使用它,但抛出了异常。

} catch (InputMismatchException e) {
    System.out.println("input musi byt cele cislo");
    scanner.next();//consume
    isRunning = true;
}

但是您不应该使用异常和 try-catch 部分作为控制逻辑的主要部分。 Scanner 提供 hasNextInt() 方法来测试用户是否提供了有效输入。所以你的代码应该像

System.out.print("give me the money:");//ask user of integer
while(!scanner.hasNextInt()){//test is provided value is valid integer
    String token = scanner.next();//consume incorrect value
    //inform that value is not correct and ask for new one
    System.our.println(token + " is not considered as valid number");
    System.our.print("please try again:");
}
//here we know that user provided valid integer
value = scanner.nextInt();

你应该在扫描输入之前重新初始化扫描器引用

 public static void main(String args[]) {
    Scanner scanner = null;
    boolean isRunning = true;
    int input;

    while (isRunning) {
        System.out.println("insert a number:");
        try {
            scanner = new Scanner(System.in);
            input = scanner.nextInt();
            inputToString(input);
            isRunning = false;
        } catch (InputMismatchException e) {
            System.out.println("input musi byt cele cislo");
            isRunning = true;
        }

    }
}

public static void inputToString(int input) {
    System.out.println(input);
}

这有效