#java #exception
#java #исключение
Вопрос:
Я создал неизменяемый класс, который реализует обязанности в отношении матричных операций, его конструктор выдает исключение при столкновении с недопустимым вводом
public Class Matrix{
public Matrix(int[][] matrix) throws Exception {
if (!isValid(matrix))
throw new Exception("Bad Matrix");
sth();
sth();
sth();
}
public Matrix transpose() {
int[][] transposeMatrix = new int[column][row];
sth();
sth();
sth();
try {
return new Matrix(transposeMatrix);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
в методе transpose новый экземпляр класса Matrix хочет быть создан, очевидно, что этот метод отвечает за обработку исключения, и это проблема, теперь я не знаю, как вернуть экземпляр Matrix
Ответ №1:
Проблема в том, что вы бросаете Exception
в конструктор. Выбрасывание и / или объявление Exception
почти всегда действительно плохая идея.
В этом случае лучше выбросить конкретное непроверенное исключение. Либо объявите свой собственный класс исключений, либо создайте существующий. IllegalArgumentException
было бы хорошим выбором.
Поскольку IllegalArgumentException
флажок снят, вам не нужно будет объявлять его в подписи вашего Matrix
конструктора, и вам не нужно будет «перехватывать или объявлять» его везде, где вы используете конструктор.
Что касается того, как вы должны возвращать a Matrix
, если вы не можете его создать. Есть два простых ответа 1:
-
Не перехватывайте исключение. Пусть он распространяется на вызывающую сторону… который в первую очередь предоставил неверный ввод.
-
Верните a
null
. Обратите внимание, что это должно быть сделано в коде, вызывающем конструктор, поскольку конструктор не может вернутьnull
.
ОДНАКО возврат null
приводит к другим проблемам:
-
Если вызывающий (скажем)
transpose
не проверяет результат вызова и действует соответствующим образом, это может привести к исключению NullPointerException в дальнейшем. -
Если вызов выполняет проверку, нет ничего, объясняющего, почему результат
null
. Действительно, любое объяснение, которое вы могли бы включить в сообщение об исключении, Будет отброшено (или сброшено в журнал и т. Д. В виде трассировки стека), Так что конечному пользователю нечего сказать… об их неправильном вводе.
1 — Существует и третий подход. Реализуйте способ представления недопустимой матрицы в качестве Matrix
экземпляра. Например, вы можете объявить подкласс Matrix
и вызвать его InvalidMatrix
. Некоторые методы этого подкласса будут вызывать исключения; например, «вы не можете транспонировать недопустимую матрицу». Это также повлекло бы за собой использование фабричного метода, поскольку new
операция не может создавать экземпляры разных классов в зависимости от аргументов.
Можно утверждать, что это нарушает LSP, поскольку an InvalidMatrix
нельзя использовать как реальную матрицу. Но также можно утверждать, что это не нарушает LSP, поскольку любой метод или конструктор Java может неявно генерировать непроверенное исключение. В любом случае, это прагматичное решение.
Обратите внимание, что в стандартной библиотеке классов Java SE есть примеры подобных вещей. Например unmodifiableList
, метод в Collections
(javadoc) создает List
экземпляр, который выдает UnsupportedOperationException
, если вы пытаетесь его изменить.
Ответ №2:
Есть несколько операторов, которые вы можете использовать в блоке catch, 1-й выдает исключение во время выполнения, 2-й возвращает пустую матрицу, а 3-й возвращает null;
-
throw new RuntimeException();
-
return new Matrix(new int[0][0]);
-
return null;
Комментарии:
1. Спасибо за ответ, но я искал решение на основе рефакторинга, которое было достигнуто в сообщении, помеченном как зеленое решение