【发布时间】:2010-09-05 12:59:41
【问题描述】:
因此,在 Java 中,构造函数的第一行必须是对 super 的调用……无论是隐式调用 super(),还是显式调用另一个构造函数。我想知道的是,为什么我不能在它周围放一个 try 块?
我的具体情况是我有一个模拟类进行测试。没有默认构造函数,但我想要一个使测试更易于阅读。我还想将构造函数抛出的异常包装到 RuntimeException 中。
所以,我实际上想要做的是:
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 不希望我有一个处于潜在不一致状态的构造对象......但是,在进行模拟时,我不在乎。看来我应该能够做到以上...或者至少我知道以上对于我的情况是安全的...或者似乎无论如何都应该这样做。
我正在覆盖我在测试类中使用的任何方法,因此我没有使用未初始化变量的风险。
【问题讨论】:
-
一个有趣的提示是,这纯粹是 Java 语言的限制。等效的字节码是完全有效的。
-
您确定字节码仍然有效吗?我记得在有人利用了我在下面演示的由此产生的安全漏洞后,它就失效了。
-
因为规则不允许。阅读JDK spec。即使你通过了编译器,验证器也会拒绝它。
标签: java exception mocking try-catch