在 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
/catch
。 Scanner
为您提供了一种避免异常的便捷方式:在调用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);
}
这有效
嗨,我是编程新手,我遇到了这个问题。我想使用扫描仪从用户那里获取输入。程序应该尝试输入是否有效,然后调用一个函数来完成这项工作。问题是如果输入无效,我希望程序重复请求用户输入。所以我在 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
/catch
。 Scanner
为您提供了一种避免异常的便捷方式:在调用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);
}
这有效