异常后继续循环

时间:2023-01-11 08:40:42

i have this piece of code. I wanted to return to the beginning of loop and ask for user input again. However, it always loops without stopping to ask for input. What is wrong with my code? thanks

我有这段代码。我想回到循环的开头并再次询问用户输入。但是,它始终循环而不停止要求输入。我的代码出了什么问题?谢谢

while(true){
    ... 
    try {
        int choice = input.nextInt(); <<---=- this should stop and ask for input, but it always loops without stopping.

    } catch (InputMismatchException e){
        << I want to return to the beginning of loop here >>
    }

}

6 个解决方案

#1


1  

From http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#nextInt%28int%29 :

来自http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#nextInt%28int%29:

"If the translation is successful, the scanner advances past the input that matched."

“如果翻译成功,扫描仪将超过匹配的输入。”

Ah, but what if the translation is not successful? In that case, the scanner does not advance past any input. The bad input data remains as the next thing to be scanned, so the next iteration of the loop will fail just like the previous one--the loop will keep trying to read the same bad input over and over.

啊,但如果翻译不成功怎么办?在这种情况下,扫描仪不会超过任何输入。糟糕的输入数据仍然是下一个要扫描的东西,因此循环的下一次迭代将像前一次一样失败 - 循环将继续尝试反复读取相同的错误输入。

To prevent an infinite loop, you have to advance past the bad data so that you can get to something the scanner can read as an integer. The code snippet below does this by calling input.next():

为了防止无限循环,您必须超越坏数据,以便您可以获得扫描仪可以读取为整数的内容。下面的代码片段通过调用input.next()来完成此操作:

    Scanner input = new Scanner(System.in);
    while(true){
        try {
            int choice = input.nextInt();
            System.out.println("Input was " + choice);
        } catch (InputMismatchException e){
            String bad_input = input.next();
            System.out.println("Bad input: " + bad_input);
            continue;
        }
    }

#2


1  

You haven't posted anything asking for input,

你还没有发布要求输入的内容,

Scanner input = new Scanner(System.in);
int choice;
while (true) {
  System.out.println("Please enter an int: ");
  if (input.hasNextInt()) {                // <-- Check if there is an int.
    choice = input.nextInt();
    break;
  } else {
    if (!input.hasNext()) {                // <-- Check if there is input.
      System.err.println("No more input");
      System.exit(1);
    }
    // What ever is in the buffer isn't an int, print the error.
    System.out.printf("%s is not an int%n", input.next());
  }
}
// Display the choice.
System.out.printf("choice = %d%n", choice);

#3


0  

This works fine:

这很好用:

import java.util.InputMismatchException;
import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int choice;

        while(true){
            try {
                choice = input.nextInt();
                System.out.println("Your choice: " + choice);
            } catch (InputMismatchException e){
                e.printStackTrace();
            }
        }
    }
}

#4


0  

Try doing do while loop.

尝试做while循环。

       do
        {
            try
            {

               //get user input
                done = true; 
            } 

            catch (InputMismatchException e)
            {
                System.out.println("The number entered needs to be a int");
            }


        } while (!done);

#5


0  

This should throw and catch the exception and the continue command should send you back to your while loop. you need either a continue or a flag to tell your while when it stops being true.

这应该抛出并捕获异常,continue命令应该将您发送回while循环。你需要一个继续或一个标志来告诉你什么时候它是真的。

while(true)
{
try 
{
   int choice = input.nextInt();
   throw new InputMismatchException();

} 
catch (InputMismatchException e)
{
continue;
}
}

#6


0  

Put a line separator in your catch block.

在catch块中放置一个行分隔符。

Scanner input = new Scanner(System.in);
while(true)
    {
        try 
        {
            int choice = input.nextInt(); 
        } catch (InputMismatchException e)
        {
            input.next(); // Line separator
        }

    }

#1


1  

From http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#nextInt%28int%29 :

来自http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#nextInt%28int%29:

"If the translation is successful, the scanner advances past the input that matched."

“如果翻译成功,扫描仪将超过匹配的输入。”

Ah, but what if the translation is not successful? In that case, the scanner does not advance past any input. The bad input data remains as the next thing to be scanned, so the next iteration of the loop will fail just like the previous one--the loop will keep trying to read the same bad input over and over.

啊,但如果翻译不成功怎么办?在这种情况下,扫描仪不会超过任何输入。糟糕的输入数据仍然是下一个要扫描的东西,因此循环的下一次迭代将像前一次一样失败 - 循环将继续尝试反复读取相同的错误输入。

To prevent an infinite loop, you have to advance past the bad data so that you can get to something the scanner can read as an integer. The code snippet below does this by calling input.next():

为了防止无限循环,您必须超越坏数据,以便您可以获得扫描仪可以读取为整数的内容。下面的代码片段通过调用input.next()来完成此操作:

    Scanner input = new Scanner(System.in);
    while(true){
        try {
            int choice = input.nextInt();
            System.out.println("Input was " + choice);
        } catch (InputMismatchException e){
            String bad_input = input.next();
            System.out.println("Bad input: " + bad_input);
            continue;
        }
    }

#2


1  

You haven't posted anything asking for input,

你还没有发布要求输入的内容,

Scanner input = new Scanner(System.in);
int choice;
while (true) {
  System.out.println("Please enter an int: ");
  if (input.hasNextInt()) {                // <-- Check if there is an int.
    choice = input.nextInt();
    break;
  } else {
    if (!input.hasNext()) {                // <-- Check if there is input.
      System.err.println("No more input");
      System.exit(1);
    }
    // What ever is in the buffer isn't an int, print the error.
    System.out.printf("%s is not an int%n", input.next());
  }
}
// Display the choice.
System.out.printf("choice = %d%n", choice);

#3


0  

This works fine:

这很好用:

import java.util.InputMismatchException;
import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int choice;

        while(true){
            try {
                choice = input.nextInt();
                System.out.println("Your choice: " + choice);
            } catch (InputMismatchException e){
                e.printStackTrace();
            }
        }
    }
}

#4


0  

Try doing do while loop.

尝试做while循环。

       do
        {
            try
            {

               //get user input
                done = true; 
            } 

            catch (InputMismatchException e)
            {
                System.out.println("The number entered needs to be a int");
            }


        } while (!done);

#5


0  

This should throw and catch the exception and the continue command should send you back to your while loop. you need either a continue or a flag to tell your while when it stops being true.

这应该抛出并捕获异常,continue命令应该将您发送回while循环。你需要一个继续或一个标志来告诉你什么时候它是真的。

while(true)
{
try 
{
   int choice = input.nextInt();
   throw new InputMismatchException();

} 
catch (InputMismatchException e)
{
continue;
}
}

#6


0  

Put a line separator in your catch block.

在catch块中放置一个行分隔符。

Scanner input = new Scanner(System.in);
while(true)
    {
        try 
        {
            int choice = input.nextInt(); 
        } catch (InputMismatchException e)
        {
            input.next(); // Line separator
        }

    }