Использование Super в конструкторе производного класса, когда базовый класс требует исключения для обнаружения
Я пытаюсь получить класс B для нового класса C в Java. Конструктор базового класса требует, чтобы незарегистрированные исключения были выброшены или перехвачены. Но если я пытаюсь поместить super (..) в try / catch, мне говорят, что вызов super должен быть первым оператором в конструкторе. Кто-нибудь знает способ обойти это?
public class C extends B
{
//Following attempt at a constructor generates the error "Undeclared exception E; must be caught or declared
//to be thrown
public C(String s)
{
super(s);
}
//But the below also fails because "Call to super must be the first statement in constructor"
public C(String s)
{
try
{
super(s);
}
catch( Exception e)
{
}
}
}
Большое спасибо, Крис
4 ответа
Вы всегда можете объявить Exception
в сигнатуре конструктора с использованием условия throws.
public C(String s) throws WhatEverException
{
Единственный способ, которым я знаю, - это также генерировать исключение в конструкторе подкласса.
public class B {
public B(String s) throws E {
// ... your code .../
}
}
public class C extends B {
public C(String s) throws E {
super(s);
}
}
Вы не можете определить конструктор без вызова супер-конструктора в первом выражении. Если это возможно, вы можете выдать исключение времени выполнения, тогда вам не нужно писать блоки try/catch.
Ну, есть три вещи, которые вам нужно понять.
- В дочернем конструкторе супер должно быть первым утверждением,
- Если метод родительского класса выдает исключение, тогда у дочернего класса есть возможность либо перехватить его, либо выбросить исключение в родительский класс.
- Вы не можете уменьшить область исключения в дочернем классе.
Пример -
public class Parent {
public Parent(){
throw new NullPointerException("I am throwing exception");
}
public void sayHifromParent(){
System.out.println("Hi");
}
}
public class Child extends Parent{
public Child()throws NullPointerException{
super();
}
public static void main(String[] args) {
Child child = new Child();
System.out.println("Hi");
child.sayHifromParent();
}
}