为什么我不能在我的 super() 调用周围使用 try 块?
因此,在Java中,构造函数的第一行必须是对超级...无论是隐式调用 super(),还是显式调用另一个构造函数。我想知道的是,为什么我不能围绕这一点设置一个尝试块?
我的具体情况是,我有一个用于测试的模拟类。没有默认构造函数,但我希望有一个使测试更易于阅读。我还想将从构造函数引发的异常包装到运行时异常中。
所以,我想做的是有效地:
public class MyClassMock extends MyClass {
public MyClassMock() {
try {
super(0);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// Mocked methods
}
但Java抱怨说,super并不是第一个声明。
我的解决方法:
public class MyClassMock extends MyClass {
public static MyClassMock construct() {
try {
return new MyClassMock();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public MyClassMock() throws Exception {
super(0);
}
// Mocked methods
}
这是最好的解决方法吗?为什么Java不允许我做前者?
我对“为什么”的最佳猜测是,Java不想让我有一个可能处于不一致状态的构造对象......但是,在做模拟时,我不在乎这一点。看来我应该能够做到以上...或者至少我知道以上对我的情况是安全的...或者似乎无论如何都应该如此。
我正在重写我从测试类中使用的任何方法,因此不存在使用未初始化变量的风险。