提问者:小点点

Catch Block不打印无效输入的语句


我希望用户输入一个0-9之间的数字。如果他们输入的数字超出了这个范围(负数或大于9的数字),他们输入的输入是无效的。此外,我想使用try catch块来识别不正确的输入类型(字符串),并打印无效。

用户无需重新输入输入。一次就可以了。

到目前为止我所尝试的:

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

public class guessinggame
{
    public static void main (String[] args)
    {
        int randomNumber = new Random().nextInt(10);
        System.out.println("My number is " + randomNumber + ". ");

        System.out.println("I’m thinking of a number between 0 and 9.");
        System.out.println("What is your guess:");


        Scanner keyboard = new Scanner(System.in);
        int guess = keyboard.nextInt();

            try{
                input = keyboard.nextInt();

            }catch (InputMismatchException e){
                guess = keyboard.nextInt();
                System.out.println("Invalid.");
            }



           if (guess < randomNumber) {
                System.out.println("your guess was too low.");
           }else if (guess > randomNumber){
                System.out.println("your guess was too high.");
            }else if (guess == randomNumber){
                System.out.println("your guess was correct.");
            }else if (guess < 0){
                System.out.println("Invalid.");
            }else if (guess > 9){
                System.out.println("Invalid.");
          }
        }
    }

这里只有我的try catch块:

            try{
                input = keyboard.nextInt();

            }catch (InputMismatchException e){
                guess = keyboard.nextInt();
                System.out.println("Invalid.");
            }

我遇到的问题是,在编译时,我输入一个字符串输入,例如“abc”,程序会创建一个这种格式的运行时错误:

Exception in thread "main" java.util.InputMismatchException
    at java.util.Scanner.throwFor(Scanner.java:864)
    at java.util.Scanner.next(Scanner.java:1485)
    at java.util.Scanner.nextInt(Scanner.java:2117)
    at java.util.Scanner.nextInt(Scanner.java:2076)
    at guessinggame.main(guessinggame.java:17)

相反,在输入字符串后应该显示的所有内容都是:无效。根据语句System. out.println(“无效”);在我的catch块中。


共2个答案

匿名用户

您的错误被抛出在这一行:int猜测=keyboard. nextInt();,它没有被try/catch语句包围。正如您所知,每次调用Scanner.nextInt()时,您都在请求新行。尝试这样做:

int guess = -1; // This will be an invalid input
try{
    guess = keyboard.nextInt();
}catch (InputMismatchException e){
    // Because guess is already -1, "invalid" will be printed out by 
    // Below if statements
}

这样,如果用户输入无效的猜测,您可以使用已经创建的if语句来处理它。

匿名用户

用户无需重新输入输入。一次就可以了。

您要求输入三次:

int guess = keyboard.nextInt(); // here

try{
    input = keyboard.nextInt(); // here

}catch (InputMismatchException e){
    guess = keyboard.nextInt(); // and here
    System.out.println("Invalid.");
}

第一个是抛出异常。由于该异常没有被捕获,它正在终止应用程序。

看起来你只是想要这个:

int guess;
try {
    input = keyboard.nextInt();
} catch (InputMismatchException e) {
    System.out.println("Invalid.");
    return;
}

代替catch块末尾的返回,您可以做其他事情,无论您想做什么都取决于您。但是如果猜测从未设置为有效的int,则该方法中的其余逻辑将不适用,因此默认情况下,我只是在此处退出该方法。

但基本上,如果您希望用户输入一次输入,那么只要求一次。并且任何时候您想处理异常,请将抛出异常的代码包装在try/catch中以处理它。