Я получаю сообщение об ошибке "Необработанный исключение типа 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() );
}
}
}
Конструктор подкласса не может обработать исключение, созданное его конструктором суперкласса.
Единственное, что вы можете сделать, это объявить конструктор подкласса как бросание тех же (отмеченных) исключений, что объявляется конструктором суперкласса; например
B() throws Exception {
System.out.println ("Executing class B constructor");
}
Это означает, что вы не можете получить сообщение "Executing class B constructor"
если A()
выдает исключение.
Если вы думаете об этом, это хорошо. Если вы смогли поймать исключение из super(...)
в конструкторе подкласса, вам придется иметь дело с объектом, который, возможно, не был полностью инициализирован. Это, вероятно, будет проблематичным.
Кроме того, если вы хотите иметь дело с исключениями, выходящими из конструктора суперкласса, скройте конструктор подкласса (т.е. Сделайте его private
) и вместо этого используйте фабричный метод для создания экземпляров подкласса. Этот метод может обрабатывать исключения, которые исходят из конструктора super или subclass. Но обратите внимание, что если конструктор не делает что-то мерзкое (например, контрабанда this
из-за исключения), вы все равно не увидите ссылку на частично инициализированный/сломанный объект.
Я предполагаю, что это всего лишь пример, но стоит отметить, что это плохая идея объявить метод как бросание Exception
(или Throwable
). Вы должны объявить метод как бросающий фактические исключения, которые бросаются.
Вы также должны генерировать исключение в подклассе.
B() throws Exception
{
System.out.println ("Executing class B constructor");
}
Добавить предложение throws в B. B() выдает исключение. Конструктор B ожидает, что исключение будет обработано, поскольку оно является дочерним по отношению к A. Так как это конструктор, вы не можете поместить его внутри try catch. Таким образом, вариант состоит в том, чтобы бросить его.