java.lang.ExceptionInInitializerError 表明**類初始化階段**發生異常。JVM 在執行類的 `
public class AA {
private static AA aa = new AA(); // 靜態字段初始化
private AA() { // 構造方法
init(); // 調用 init()
}
public void init() {
// 業務邏輯拋出異常
throw new RuntimeException("初始化失敗");
}
}
類加載時 → 執行 `
static {
// 載入配置文件、連接數據庫等
String config = loadConfig(); // 可能拋 IOException
// ...
}
Exception in thread "main" java.lang.ExceptionInInitializerError
at com.example.Main.main(Main.java:10)
Caused by: java.lang.RuntimeException: 初始化失敗
at com.example.AA.init(AA.java:15)
at com.example.AA.(AA.java:8)
| 不推薦 | 推薦替代方案 |
|---|---|
| 靜態塊連接數據庫 | 延遲初始化(懶加載)、單例模式、Spring `@PostConstruct` |
| 靜態塊讀取外部配置文件 | 配置中心、環境變量、Spring `@Value`/`@ConfigurationProperties` |
| 靜態字段調用實例方法 | 工廠方法、構建者模式、依賴注入 |
private static DataSource dataSource;
static {
try {
dataSource = createDataSource();
} catch (Exception e) {
// 記錄錯誤,設置降級標誌,避免 ExceptionInInitializerError
log.error("DataSource 初始化失敗,啟用內存模式", e);
dataSource = new EmbeddedDataSource(); // 降級方案
}
}
將易變初始化邏輯放入單獨模塊/類加載器,失敗不影響主程序啟動。
| 異常 | 觸發階段 | 典型原因 |
|---|---|---|
| ExceptionInInitializerError | 類初始化 (` | 靜態字段/塊異常 |
| NoClassDefFoundError | 類加載/鏈接 | 依賴類初始化失敗、類文件丟失 |
| ClassNotFoundException | 類加載 | Class.forName()、ClassLoader.loadClass() 找不到類 |
**關鍵關聯**:類 A 初始化失敗拋 `ExceptionInInitializerError`,其他類引用 A 時會拋 `NoClassDefFoundError: Could not initialize class A`。