Исключение выброса — с детализацией: какая ячейка содержит неправильные значения

#java #arrays #exception

#java #массивы #исключение

Вопрос:

Got method , который принимает two dimensional String array в качестве параметра, size array должен быть 4x4 , следующая method() проверка, если size неверно, method() throw new MyArraySizeException(arr) , после method() должна суммировать все элементы array , и если в array ячейке не содержится digital значения method() , обязательно throw MyArrayDataException — с детализацией, в которой ячейка содержит неправильные значения.

Метод:

   private static final int COLUMNS = 4;
    private static final int ROWS = 4;

    private static int convertString(String[][] arr){
        int result = 0;
        for (int i = 0; i < arr.length ; i  ) {
            for (int j = 0; j < arr[i].length ; j  ) {
                if (arr.length != 4 || arr[i].length != 4){
                    throw new MyArraySizeException(arr);
                }
            }
        }

        for (int i = 0; i < arr.length ; i  ) {
            for (int j = 0; j < arr[i].length ; j  ) {
                if (arr[i][j].matches("[0-9] ")) {
                    result  = Integer.parseInt(arr[i][j]);
                }else {
                    throw new MyArrayDataException(arr);
                }
            }
        }

        return resu<
    }
 

исключение: MyArrayDataException(arr):

  private String[][]arr;

    public MyArrayDataException(String[][]arr){
        this.arr = arr;
        for (int i = 0; i < arr.length ; i  ) {
            for (int j = 0; j < arr[i].length; j  ) {
                if (arr[i][j].matches("[a-zA-Z] ")){
                    System.out.println("Incorrect values in: "  "["   i   "]"   ""   "["   j   "] is "   arr[i][j]);
                }
            }
        }
    }
}
 

Method() работать нормально exception тоже работает, проблема в том, что мне это не нравится sout , и я хочу изменить
реализацию MyArrayDataException(arr) . Вместо этого я хочу использовать super() constructor sout .
Чтобы передать некорректную ячейку super() constructor , как я могу этого добиться?

Что — то вроде этого:

Я хочу, чтобы это исключение было в другом классе

 //it's not work

      private String[][]arr;
        int test;
        int test1;
    
        public MyArrayDataException(String[][]arr){
            super(String.format("Incorrect values in '%d'", arr[test][test1]));
            this.arr = arr;
            }
        }
 

Ответ №1:

Да, печать в sysout в конструкторе исключений действительно довольно глупо. У вас правильный инстинкт.

Самый простой способ получить то, что вы хотите, — создать static метод, который преобразует массив строк в печатаемое значение:

 public MyArrayDataException(String[][] arr) {
    super(String.format("Incorrect values in '%s'", arrToString(arr));
    this.arr = arr;
}

private static String arrToString(String[][] arr) {
    // write code here
}
 

Обратите внимание, что этот метод более или менее уже существует: Arrays.deepToString(arr) сделает это. Однако это выводит, например [["Hello", "World"], ["Second", "Array"]] , если вам нужна многострочная выровненная матрица bonanza, вам придется использовать описанный выше трюк. Если deepToString работает для вас, то вы можете просто вызвать это и отказаться от написания arrToString самостоятельно.

Комментарии:

1. Я хочу, чтобы это исключение было в другом классе

2. Ничто не мешает вам сделать это, @Dartweiler.

Ответ №2:

Одно замечание по поводу вашего MyArrayDataException :

В том месте, где вы обнаруживаете, что содержимое массива не является допустимым положительным числом, вы уже знаете индексы, где это происходит. Я бы сделал их ( i и j ) дополнительными параметрами для конструктора исключений, поэтому вам не нужно повторно сканировать весь массив в поисках позиции ошибки:

     public MyArrayDataException(String[][]arr, int i, int j) {
        super(String.format("Incorrect value '%s' at [%d][%d]", 
                            arr[i][j], i, j));
        this.arr = arr;
    }
 

Кстати, логика вашего повторного сканирования ошибочна: как насчет элемента being "abc123" ? Конечно, это незаконно, но это не соответствует "[a-zA-Z] " действительности. Чек лучше бы был:

 if (! arr[i][j].matches("[0-9] "))