возвращаемый объект метода выдает исключение, не обрабатывает, как это исправить?

#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:

  1. Не перехватывайте исключение. Пусть он распространяется на вызывающую сторону… который в первую очередь предоставил неверный ввод.

  2. Верните 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;

  1. throw new RuntimeException();

  2. return new Matrix(new int[0][0]);

  3. return null;

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

1. Спасибо за ответ, но я искал решение на основе рефакторинга, которое было достигнуто в сообщении, помеченном как зеленое решение