Java 尝试/捕捉无限循环?
帮助,我对java完全陌生,我正在尝试创建一个循环,请求用户输入一个数字。如果用户输入的不是数字,我希望捕获异常并重试以获得正确的输入。我使用while循环实现了这一点,但是它不会给用户在错误发生后输入任何内容的机会,它会循环除此之外的所有内容。请帮助我了解什么是错误的和正确的方法来做这件事。。。非常感谢。这就是我所拥有的:Java 尝试/捕捉无限循环?,java,while-loop,try-catch,Java,While Loop,Try Catch,帮助,我对java完全陌生,我正在尝试创建一个循环,请求用户输入一个数字。如果用户输入的不是数字,我希望捕获异常并重试以获得正确的输入。我使用while循环实现了这一点,但是它不会给用户在错误发生后输入任何内容的机会,它会循环除此之外的所有内容。请帮助我了解什么是错误的和正确的方法来做这件事。。。非常感谢。这就是我所拥有的: import java.util.Scanner; import java.util.InputMismatchException; public
import java.util.Scanner;
import java.util.InputMismatchException;
public class simpleExpressions {
public static void main (String[] args) {
Scanner keyboard = new Scanner(System.in);
while ( true ) {
double numOne;
System.out.println("Enter an Expression ");
try {
numOne = keyboard.nextInt();
break;
} catch (Exception E) {
System.out.println("Please input a number only!");
} //end catch
} //end while
} //end main
使用键盘.next()在catch
子句中的code>或keyboard.nextLine()
,使用从中留下的无效令牌
当抛出InputMismatchException
时,扫描仪不会移动到下一个标记。相反,它让我们有机会使用不同的、更合适的方法来处理该令牌,如:nextLong()
,nextDouble()
,nextBoolean()
但若你们想转移到其他令牌,你们需要让扫描器毫无问题地读取它。为此,请使用可以接受任何数据的方法,如next()
或nextLine()
。没有它,无效的令牌将不会被使用,并且在另一次迭代中,nextInt()
将再次尝试处理相同的数据,再次抛出InputMismatchException,从而导致无限循环
有关代码中其他问题的详细信息,请参阅@MarkoTopolnik answer。使用键盘。下一步()在catch
子句中的code>或keyboard.nextLine()
,使用从中留下的无效令牌
while ( true )
{
double numOne;
System.out.println("Enter an Expression ");
try {
numOne = keyboard.nextInt();
break;
}
catch (Exception E) {
System.out.println("Please input a number only!");
}
当抛出InputMismatchException
时,扫描仪不会移动到下一个标记。相反,它让我们有机会使用不同的、更合适的方法来处理该令牌,如:nextLong()
,nextDouble()
,nextBoolean()
但若你们想转移到其他令牌,你们需要让扫描器毫无问题地读取它。为此,请使用可以接受任何数据的方法,如next()
或nextLine()
。没有它,无效的令牌将不会被使用,并且在另一次迭代中,nextInt()
将再次尝试处理相同的数据,再次抛出InputMismatchException,从而导致无限循环
有关代码中其他问题的详细信息,请参阅@MarkoTopolnik answer
while ( true )
{
double numOne;
System.out.println("Enter an Expression ");
try {
numOne = keyboard.nextInt();
break;
}
catch (Exception E) {
System.out.println("Please input a number only!");
}
这有几个问题:
numOne
尚未预先初始化,因此在try catch
之后不会明确分配它,因此您将无法引用它李>
- 如果计划在循环之后使用
numOne
,则必须在循环范围之外声明它李>
- (您的直接问题)在发生异常后,您不会调用
scanner.next()
,因此您永远不会使用未解析为int
的无效令牌。这使得您的代码在第一次遇到无效输入时进入无限循环
这有几个问题:
numOne
尚未预先初始化,因此在try catch
之后不会明确分配它,因此您将无法引用它李>
- 如果计划在循环之后使用
numOne
,则必须在循环范围之外声明它李>
- (您的直接问题)在发生异常后,您不会调用
scanner.next()
,因此您永远不会使用未解析为int
的无效令牌。这使得您的代码在第一次遇到无效输入时进入无限循环
在这种情况下,您可能希望使用do…while循环,因为您总是希望在循环中至少执行一次代码
int numOne;
boolean inputInvalid = true;
do {
System.out.println("Enter an expression.");
try {
numOne = keyboard.nextInt();
inputInvalid = false;
} catch (InputMismatchException ime) {
System.out.println("Please input a number only!");
keyboard.next(); // consume invalid token
}
} while(inputInvalid);
System.out.println("Number entered is " + numOne);
如果抛出异常,inputInvalid
的值保持为真,循环继续运行。如果未引发异常,则inputInvalid
将变为false,并允许执行离开循环
(根据此处其他答案提供的建议,添加了对Scanner next()方法的调用以使用无效令牌。)在这种情况下,您可能希望使用do…while循环,因为您总是希望至少在循环中执行一次代码
int numOne;
boolean inputInvalid = true;
do {
System.out.println("Enter an expression.");
try {
numOne = keyboard.nextInt();
inputInvalid = false;
} catch (InputMismatchException ime) {
System.out.println("Please input a number only!");
keyboard.next(); // consume invalid token
}
} while(inputInvalid);
System.out.println("Number entered is " + numOne);
如果抛出异常,inputInvalid
的值保持为真,循环继续运行。如果未引发异常,则inputInvalid
将变为false,并允许执行离开循环
(根据此处其他答案提供的建议,添加了对Scanner next()方法的调用以使用无效令牌。)请不要忘记在问题中添加“?”!有些人在页面中搜索“?”,如果“问题”中不存在,则直接转到行中的下一个(实际)问题。请不要忘记在问题中添加“?”!一些人在页面中搜索“?”,如果“问题”中不存在任何问题,则直接进入下一个(实际的)问题。我明白了。盲人说。谢谢你,我明白了。我明白了。盲人说。谢谢你,我明白了。keyboard.nextLine()
不是用来消费\n
的,而是用来消费无效的令牌(以及行的其余部分,但这不是必需的),当抛出异常时,该令牌不会被消费。因此,如果catch部分中的nextLine()
或next()
不存在使用此令牌循环的问题,那么将尝试无限地解析相同的数据。4年前。。。我学到了很多。我试着纠正你的答案。如果您不同意我的编辑,请随意回滚。keyboard.nextLine()
不是用来消费\n
的,而是用来消费无效的令牌(以及行的其余部分,但这不是必需的),当抛出异常时,该令牌不会被消费。因此,如果catch部分中的nextLine()
或next()
不存在使用此令牌循环的问题,那么将尝试无限地解析相同的数据。4年前。。。我学到了很多。我试着纠正你的答案。如果你愿意