【问题标题】:Try Catch Block Not Catching String Input (InputMismatchException)尝试 Catch 块未捕获字符串输入 (InputMismatchException)
【发布时间】:2016-09-27 00:36:24
【问题描述】:

我需要阻止用户输入字符串值。

这是我迄今为止尝试过的。

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();
        guess1(guess);


        int input = 0;


            try{
                input = keyboard.nextInt();

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



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

我收到的错误是:Duplicate local variable guess 阻止程序编译,但是我想我也错过了让这个程序做我想做的事情。

它只需要接受 0-9 之间的整数值作为输入。其他任何内容(包括字符串)都应返回无效。

【问题讨论】:

  • 阅读错误!!!编译器不会为了好玩而吐出这些东西。它们很重要。如果您的代码无法编译,您怎么知道 try-catch 不起作用 - 即您的问题标题非常糟糕!
  • 它不起作用,因为我还收到一个运行时错误,在 java.util.Scanner.throwFor(Scanner.java:864) 线程“main”java.util.InputMismatchException 中显示异常在 java.util.Scanner.next(Scanner.java:1485) 在 java.util.Scanner.nextInt(Scanner.java:2117) 在 java.util.Scanner.nextInt(Scanner.java:2076) 在 guessinggame.main( guessinggame.java:17)
  • @sawreals2:如果您可以显示更新后的代码并指出哪一行引发了异常,如果您仍然遇到问题,社区可以继续提供帮助。
  • @David 我已经更新了代码。 mismatcherror 在第 17 行。我尝试按照 Eric 的建议将 int guess 更改为 guess 但这给出了一个错误,表明它无法解析为变量。程序检测到不匹配错误,但我希望它打印出“无效”,正如我在 catch 块中所写的那样。
  • @sawreals2:下面的答案是建议您从该变量的 second 声明中删除 int 关键字,而不是第一个。很明显,一个变量需要先声明才能使用。至于你得到的异常,你在程序运行时提供什么作为输入?如果输入无法解析为int,那么nextInt() 将抛出异常。您可以将其包装在 try/catch 块中以处理该异常。

标签: java exception-handling try-catch inputmismatchexception


【解决方案1】:

编译器给你错误是因为你已经声明了两次guess

  • int guess = keyboard.nextInt();开头一次
  • 然后在 catch 子句中再次使用int guess = keyboard.nextInt();

还请注意,您在代码中多次readInt(),这意味着您尝试多次获取用户输入。你应该在你的代码中引用guess

如果您经常遇到编译错误等问题,您可能需要使用 IDE,例如 Eclipse

【讨论】:

    【解决方案2】:

    主要错误是您在catch 块中重新声明guess

    如果输入了无效数据,你真正需要做的是loop

    int guess = -1;  // some magic number
    while (guess <= -1) {  // we do not want negative number
        try{
                guess = keyboard.nextInt();
            }catch (InputMismatchException e){
                System.out.println("Invalid - try again.");
                continue;
            }
    
        if (guess >= 0) {
            break;
        }
        System.out.println("We want between 0 and 9 - try again.");
    }
    
    // now we have valid value for guess
    

    编辑

    根据新要求

       int guess = -1;  // some magic number
        try{
                guess = keyboard.nextInt();
            }catch (InputMismatchException e){
                // do not need to do anything
            }
    
        if (guess < 0) {
                System.out.println("Invalid - will exit.");
                System.exit(-1); 
        }
    // now we have valid value for guess
    

    【讨论】:

    • 程序只需要一次进入。无需重新检查正确的值
    • 在您的示例中,如果用户againcatch 块中输入错误数据会发生什么?
    • 我将添加一个 system.exit();在“无效”之后,它应该在无效输入后停止
    • 好吧,你就不需要我们的帮助了。
    • 我愿意,但我不需要重新检查正确的值,这超出了我的范围。我只需要检查一次值。
    【解决方案3】:
    int guess = keyboard.nextInt();
    

    应该是

    guess = keyboard.nextInt();
    

    【讨论】:

    • 另外,我不能将其更改为只是猜测,在这种情况下它无法解析为变量,并且会在整个代码中产生更多错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多