java.lang.ExceptionInInitializerError異常的解決方法
今天在開發(fā)的過程中,遇到j(luò)ava.lang.ExceptionInInitializerError異常,百度查了一下,順便學(xué)習(xí)學(xué)習(xí),做個筆記
靜態(tài)初始化程序中發(fā)生意外異常的信號,拋出ExceptionInInitializerError表明在計算靜態(tài)初始值或靜態(tài)變量的初始值期間發(fā)生異常。
要理解這個異常從Java類中的靜態(tài)變量初始化過程說起,在Java類中靜態(tài)變量的初始化順序和靜態(tài)變量的聲明順序是一致的。示例程序為:
package com.lang.ininitialException;
import java.util.ArrayList;
import java.util.List;
public class StaticParams {
private static int NUM_A = getA();
private static int NUM_B = getB();
private static List<String> LIST_A = getListA();
private StaticParams() {
System.out.println("初始構(gòu)造方法");
}
public static StaticParams getInstance() {
return new StaticParams();
}
private static int getA(){
System.out.println("初始化A");
return 5;
}
private static int getB() {
System.out.println("初始化B");
return 10;
}
private static List<String> getListA() {
System.out.println("初始化List");
return new ArrayList<String>();
}
public static void main(String args[]){
StaticParams.getInstance();
}
}
運行結(jié)果:
初始化A
初始化B
初始化List
初始構(gòu)造方法
如果交換NUM_A和NUM_B的位置,那么結(jié)果就是:
初始化B
初始化A
初始化List
初始構(gòu)造方法
即:在某個靜態(tài)變量的初始化還未執(zhí)行之前就使用該靜態(tài)變量。
復(fù)現(xiàn)ExceptionInInitializerError異常的程序如下:
package com.lang.ininitialException;
import java.util.ArrayList;
import java.util.List;
public class StaticParamsSingle {
private static StaticParamsSingle sps = buildStaticParams();
// private static StaticParamsSingle sps = new StaticParamsSingle();
private static int NUM_A = getA();
private static int NUM_B = getB();
private static List<String> LIST_A = getListA();
private StaticParamsSingle(){
System.out.println("初始化構(gòu)造方法");
}
private static StaticParamsSingle buildStaticParams() {
if (sps == null) {
sps = new StaticParamsSingle();
}
int result = NUM_A + NUM_B;
System.out.println("result is:" + result);
LIST_A.add("haha");
return sps;
}
public static StaticParamsSingle getInstance() {
return sps;
}
private static int getA(){
System.out.println("初始化A");
return 5;
}
private static int getB() {
System.out.println("初始化B");
return 10;
}
private static List<String> getListA() {
System.out.println("初始化List");
return new ArrayList<String>();
}
public static void main(String args[]) {
StaticParamsSingle.getInstance();
}
}
sps變量初始化中使用到的其他的變量,但其他的靜態(tài)變量還未初始化,故而在sps初始化時就會產(chǎn)生異常:
初始化構(gòu)造方法
result is:0
Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.NullPointerException
at com.lang.ininitialException.StaticParamsSingle.buildStaticParams(StaticParamsSingle.java:25)
at com.lang.ininitialException.StaticParamsSingle.<clinit>(StaticParamsSingle.java:8)
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 文件路徑正確,報java.io.FileNotFoundException異常的原因及解決辦法
- Java中java.lang.ClassCastException異常原因及解決方法
- java.lang.NullPointerException異常問題解決方案
- 解決java.util.NoSuchElementException異常的問題
- Java 異常java.lang.NoSuchFieldException解決方案
- Java類加載異常:java.lang.ClassNotFoundException解決方法
- 詳解Java中NullPointerException異常的原因詳解以及解決方法
- java.nio.file.InvalidPathException異常解決
相關(guān)文章
Java commons io包實現(xiàn)多線程同步圖片下載入門教程
這篇文章主要介紹了Java commons io包實現(xiàn)多線程同步圖片下載入門,commons io: 是針對開發(fā)IO流功能的工具類庫,其中包含了許多可調(diào)用的函數(shù),感興趣的朋友跟隨小編一起看看吧2021-04-04
關(guān)于request.getRequestDispatcher().forward()的妙用及DispatcherType
這篇文章主要介紹了關(guān)于request.getRequestDispatcher().forward()的妙用及DispatcherType對Filter配置的影響,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
集群環(huán)境中使用ehcache_動力節(jié)點Java學(xué)院整理
這篇文章主要為大家詳細介紹了集群環(huán)境中使用ehcache的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08
對Jpa中Entity關(guān)系映射中mappedBy的全面理解
這篇文章主要介紹了對Jpa中Entity關(guān)系映射中mappedBy的全面理解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
macOS上使用gperftools定位Java內(nèi)存泄漏問題及解決方案
這篇文章主要介紹了macOS上使用gperftools定位Java內(nèi)存泄漏問題,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07
SpringBoot中使用異步調(diào)度程序的高級方法
本文主要介紹了SpringBoot中使用異步調(diào)度程序的高級方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07

