开发者社区 问答 正文

遇到 ExceptionInInitializerError 怎么解决?java报错

遇到 ExceptionInInitializerError 怎么解决?java报错

在编写java的样例代码时出现这种问题。这种情况应该如何解决和避免那?

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("初始化构造方法");
  }
   
  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();
     
  }
}

错误信息:

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)

原因是什么,为什么会发生异常,以及下面到底发生了什么。如果有人能帮忙?提前谢谢

展开
收起
爱吃鱼的程序员 2020-05-26 16:22:41 1188 分享 版权
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    楼主。看了你的错误信息,有可能一下两种情况:

    1.类的静态变量未初始化就被调用。这个问题出现在使用单例模式时,那个类里面还有静态变量,根据静态变量的加载顺序是按照静态变量声明的位置开始的这个语法,静态变量的初始化写在了instance实例初始化之后导致的,检查静态变量初始化的顺序即可。

    2.就是类的静态变量或者静态代码块初始化或者加载过程中出现了异常。针对这个问题,对该类的静态变量一个个检查找出某个变量初始化失败的原因就行了。

    2020-05-26 16:41:32
    赞同 展开评论
问答分类:
问答地址: