所以,在Java中,你的构造函数的第一行,必须从调用超...是它隐含调用超(),或显式调用另一个构造。我想知道的是,为什么我不能在此尝试一下?为什么我不能在我的super()调用中使用try块?
我的具体情况是,我有一个测试模拟类。没有默认的构造函数,但我想让测试更简单。我也想把从构造函数抛出的异常封装到RuntimeException中。
所以,我想要做有效的是这样的:
public class MyClassMock extends MyClass {
public MyClassMock() {
try {
super(0);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// Mocked methods
}
但Java抱怨说,超不是第一个语句。
我的解决方法:
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不想让我有一种潜在的不一致状态构造的对象......然而,在做一个模拟,我不在乎关于那个。看起来我应该能够做到以上...或者至少我知道上述对我的情况是安全的......或者似乎它应该是反正。
我重写我从测试类中使用的任何方法,所以没有风险,我使用未初始化的变量。
有趣的是,这纯粹是Java语言的限制。等效的字节码是完全有效的。 – Antimony 2012-08-04 23:41:57
你确定字节码仍然有效吗?我记得在有人利用下面演示的安全漏洞之后,它会失效。 – Joshua 2012-12-04 00:08:40
因为规则不允许。阅读[JDK规范](http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.10)。即使你通过了编译器,验证器也会拒绝它。 – 2014-11-06 01:51:04