#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] "))