所以,在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