我正在用Java编写一个类,它是我编写的另一个类的子类,它的构造函数显式调用了超类的构造函数.超类的构造函数在直接初始化时可能抛出几种类型的异常,但是当我初始化我的子类的一个实例时,有几个异常永远不会被抛出(通过设计).
我尝试在子类的构造函数中捕获这些异常但我收到一条错误,指出"构造函数调用必须是构造函数中的第一个语句".为什么我不能抓住这些例外?
例如,下面的代码:
public class Persian_Cat extends Cat {
public Persian_Cat(File file) {
try{
super(file);
} catch(InvalidArgumentException e) {
} catch(FileNotFoundException e) {
}
}
}
Run Code Online (Sandbox Code Playgroud)
将该语句标记super(file);为错误.
我如何实现子类构造函数,以便它知道这些异常是无关紧要的?我需要这个,因为我不希望稍后在我的代码中为try {} ... catch {}包装此构造函数.
遗憾的是,如果你使用super(...);它必须是构造函数中的第一行代码.没有办法避免这种情况.
一种解决方案是创建另一个不抛出这些异常的构造函数.将此范围视为受保护而非公开可能是明智的.您可能希望记录API以明确哪些输入验证(或其他)由于哪些假设而未进行.