扫描仪无故返回错误?

时间:2016-01-13 01:29:10

标签: java string exception input java.util.scanner

我正在尝试这行代码。我想要它取一个字符串,如果它是1,2,3,4,5,6,7,8,9或10来解析它为一个int,然后检查它是否介于0和9之间(之后 - 1)。问题就在扫描仪发生后我无论做什么都会出错...

public void guessEnter() {
    Scanner scan = new Scanner(System.in);

    String guessXS;
    String guessYS;
    boolean pass1;
    boolean pass2;

    do{
        do{
            System.out.println("Enter a value for the column!");
            guessXS = scan.nextLine();
            switch(guessXS){
                case "1": case "2": case "3": case "4": case "5": case "6": case "7": case "8": case "9":case "10":
                    System.out.println("TRUE");
                    pass1 = true;
                    break;
                default:
                    System.out.println("FALSE");
                    pass1 = false;
                    break;
            }
        }while(pass1 == false);
        do{
            System.out.println("Enter a value for the row!");
            guessYS = scan.nextLine();
            switch(guessYS){
                case "1": case "2": case "3": case "4": case "5": case "6": case "7": case "8": case "9": case "10":
                    pass2 = true;
                    System.out.println("TRUE");
                    break;
                default:
                    pass2 = false;
                    System.out.println("FALSE");
                    break;
            }
        }while(pass2 == false);
        guessX = Integer.parseInt(guessXS) - 1;
        guessY = Integer.parseInt(guessYS) - 1;
    }while(guessX >= 0 && guessX <= 9 && guessY >= 0 && guessY <= 9);
}

为什么会发生这种情况超出我的范围。我对java很新,需要整理出这个错误。

错误是...... 线程“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 shipLocation.xyInput(shipLocation.java:11)

at battleShipMain.main(battleShipMain.java:53)

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

即使问题已经得到解答(错误是在另一个类中)并且提供的代码没有引起任何错误,您可能希望稍微改进一下代码。为了便于阅读和理解,以防您以后需要更改。

您可以将输入和验证部分包装在方法中:

private int readIntBetweenMinAndMax(String msg, int min, int max) {
    Scanner scanner = new Scanner(System.in);
    System.out.println(msg);
    int userInput;
    do {
        try {
            userInput = Integer.parseInt(scanner.nextLine());
        } catch (NumberFormatException e) {
            System.err.println("Please enter a valid integer");
            continue;
        }
        if (userInput > max || userInput < min) {
            System.err.println("Please enter a integer between " + min + " and " + max);
            continue;
        }
        return userInput;
    } while (true);
}

上面的方法打印一个提供的字符串msg,然后读入一个整数。它会检查用户输入是否为整数,以及大于或等于是否超过min小于或等于而不是max。如果三个条件中的一个失败,则该方法将打印错误消息并提示用户输入新的输入,直到其正确为止 注意:您当然也可以包含&#34; TRUE&#34;和&#34;错误&#34;如果你想要输出

因此,您只需要在guessEnter方法中调用该方法两次:

public void guessEnter() {
    guessX = readIntBetweenMinAndMax("Enter a value for the column!", 1, 10) - 1;
    guessY = readIntBetweenMinAndMax("Enter a value for the row!", 1, 10) - 1;
}

这将接受它们之间的一个,十个和任何数字。并在代码中减去一个。

如上所述,它只是一个建议,我不确定是否所有内容都是您的代码正确但我希望它有所帮助(: