如何优雅地处理错误输入(JAVA)

How to gracefully handle wrong input (JAVA)

这是我的代码:我想输入整数,如果我输入一个字符串,我会得到一个异常,但是我的 try catch 不起作用。我只需要帮助来优雅地处理输入。谢谢。我正在为一项大学作业做这件事,坦率地说,我不知道该怎么做,因为他在 class 中提供的示例不一定有效。

    public static void main (String[]args) {

        Assignment2 game = new Assignment2();
        game.playWordSearch();

        //  System.out.println(game.numRowCol());

        //System.out.printf("The words to find: %n %s%n %s%n %s%n %s%n %s%n %n", game.wordStorage(), game.wordStorage(), game.wordStorage(), game.wordStorage(), game.wordStorage());
    }

    Scanner keyboard = new Scanner(System.in);
    private int[][] wordBoard;
    private String[] wordList;
    private static int row;
    private static int col;

    public void playWordSearch(){
        wordBoard = numRowCol();
        wordStorage();
    }

    public int[][] numRowCol(){
        int array[] = new int[2];

        for(int i=0; i<=1; i++) {
            System.out.printf("Enter a number between (2-15): %n");
            array[i] = keyboard.nextInt();
        }
        try {
            System.out.println(array[0]);
            System.out.println(array[1]);
        } catch (
                java.util.InputMismatchException mismatchException) {
            System.out.printf("That created an exception, the message is %s%n", mismatchException.getMessage());
        }
        int arrayArray [][] = new int[array[0]][array[0]];
        return arrayArray;
    }

    public String wordStorage(){
        Scanner keyboard = new Scanner(System.in);

        System.out.printf("Enter a word with less than 8 characters: ");
        String word = keyboard.nextLine();

        return word;

    }

}

您可能希望在代码中做一些事情:

  1. 将 main 方法移动到一个空的 Runner class 中。它所做的只是实例化和 运行 Assignment2.
  2. 确保您的字段是您在 class 中定义的第一件事。它使您的代码更容易阅读。
  3. 一般静态字段都是大写的。这当然只是一个惯例。你会在网上找到很多风格指南,例如Google's guide.
  4. 了解您的错误。

我 运行 您的代码并输入了一个字符串 (java)。结果是:

Enter a number between (2-15): 
java
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 eu.webfarmr.Assignment2.numRowCol(Assignment2.java:35)
    at eu.webfarmr.Assignment2.playWordSearch(Assignment2.java:26)
    at eu.webfarmr.Assignment2.main(Assignment2.java:15)

堆栈跟踪实际上告诉您错误发生的位置 (Assignment2.java:35)。所以你知道这是你需要包装在 try/catch.

中的代码部分

例如你可以这样做:

public int[][] numRowCol() {
    int array[] = new int[2];

    try {
        for (int i = 0; i <= 1; i++) {
            System.out.printf("Enter a number between (2-15): %n");
            array[i] = keyboard.nextInt();
        }
        System.out.println(array[0]);
        System.out.println(array[1]);
    } catch (java.util.InputMismatchException mismatchException) {
        System.out.printf("That created an exception, the message is %s%n", mismatchException.getMessage());
    } catch (Exception err) {
        System.out.println("Another error occurred.");
        err.printStackTrace();
    }
    int arrayArray[][] = new int[array[0]][array[0]];
    return arrayArray;
}

但也许您应该将输入读取为字符串 and 然后尝试将输入转换为整数/双精度/其他。这会让您更好地控制转换过程。

还有,你要想想失败意味着什么。在您的情况下,您最终会得到一个部分初始化的值数组。