首页 > 解决方案 > 如何优雅地处理错误输入(JAVA)

问题描述

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

    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;

    }

}

标签: javastringexceptioninputint

解决方案


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

  1. 将 main 方法移动到它自己的空 Runner 类中。它所做的只是实例化并运行Assignment2
  2. 确保您的字段是您在课堂上定义的第一件事。它使您的代码更容易阅读。
  3. 通常,静态字段全部大写。这当然只是一个约定。你会在网上找到很多风格指南,例如Google 的指南
  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;
}

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

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


推荐阅读