Как обработать исключение, выданное конструктором суперкласса в Java?

1

Я получаю сообщение об ошибке "Необработанный исключение типа Exception". Так что у меня возникает вопрос, как мы можем справиться с этим брошенным исключением в нашем подклассе.

class A 
{

  A() throws Exception 
  {
       System.out.println ("Executing class A constructor");
       throw new IOException();
  }
}

public class B extends A 
{
  B() //error
  {
       System.out.println ("Executing class B constructor");

  }

  public static void main ( String args[] )
  {
          try 
          {
          A a = new B();
          } 
          catch ( Exception e)
          {
                      System.out.println( e.getMessage() );
          }
  }
}
Теги:
inheritance

3 ответа

2

Конструктор подкласса не может обработать исключение, созданное его конструктором суперкласса.

Единственное, что вы можете сделать, это объявить конструктор подкласса как бросание тех же (отмеченных) исключений, что объявляется конструктором суперкласса; например

    B() throws Exception {
         System.out.println ("Executing class B constructor");
    }

Это означает, что вы не можете получить сообщение "Executing class B constructor" если A() выдает исключение.

Если вы думаете об этом, это хорошо. Если вы смогли поймать исключение из super(...) в конструкторе подкласса, вам придется иметь дело с объектом, который, возможно, не был полностью инициализирован. Это, вероятно, будет проблематичным.

Кроме того, если вы хотите иметь дело с исключениями, выходящими из конструктора суперкласса, скройте конструктор подкласса (т.е. Сделайте его private) и вместо этого используйте фабричный метод для создания экземпляров подкласса. Этот метод может обрабатывать исключения, которые исходят из конструктора super или subclass. Но обратите внимание, что если конструктор не делает что-то мерзкое (например, контрабанда this из-за исключения), вы все равно не увидите ссылку на частично инициализированный/сломанный объект.


Я предполагаю, что это всего лишь пример, но стоит отметить, что это плохая идея объявить метод как бросание Exception (или Throwable). Вы должны объявить метод как бросающий фактические исключения, которые бросаются.

2

Вы также должны генерировать исключение в подклассе.

 B() throws Exception
 {
   System.out.println ("Executing class B constructor");
 }
1

Добавить предложение throws в B. B() выдает исключение. Конструктор B ожидает, что исключение будет обработано, поскольку оно является дочерним по отношению к A. Так как это конструктор, вы не можете поместить его внутри try catch. Таким образом, вариант состоит в том, чтобы бросить его.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню