Java 尝试/捕捉无限循环?

Java 尝试/捕捉无限循环?,java,while-loop,try-catch,Java,While Loop,Try Catch,帮助,我对java完全陌生,我正在尝试创建一个循环,请求用户输入一个数字。如果用户输入的不是数字,我希望捕获异常并重试以获得正确的输入。我使用while循环实现了这一点,但是它不会给用户在错误发生后输入任何内容的机会,它会循环除此之外的所有内容。请帮助我了解什么是错误的和正确的方法来做这件事。。。非常感谢。这就是我所拥有的: import java.util.Scanner; import java.util.InputMismatchException; public

帮助,我对java完全陌生,我正在尝试创建一个循环,请求用户输入一个数字。如果用户输入的不是数字,我希望捕获异常并重试以获得正确的输入。我使用while循环实现了这一点,但是它不会给用户在错误发生后输入任何内容的机会,它会循环除此之外的所有内容。请帮助我了解什么是错误的和正确的方法来做这件事。。。非常感谢。这就是我所拥有的:

    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年前。。。我学到了很多。我试着纠正你的答案。如果你愿意