SpringBoot 枚举类报错ExceptionInInitializerError的分析与解决

今天下午使用这个枚举类一直报错ExceptionInInitializerError,一直弄了快2个小时才排查出原因,终于发现和解决了!

检查常量与枚举类是否存在相互依赖!!

报错的代码如下:

public class TestEnumClass {

    /**
     * 监控项
     */
    public enum ITEM {
        ITEMA(0.1, "ITEMA",AlarmClass.Monitor.alarmKeyA),
        ITEMB(0.9, "ITEMB",AlarmClass.Monitor.alarmKeyB);

        private Double value;
        private String name;
        private String alarmKey;

        ITEM(Double value, String name, String alarmKey) {
            this.value = value;
            this.name = name;
            this.alarmKey = alarmKey;
        }

        public Double getValue() {
            return value;
        }

        public String getName() {
            return name;
        }

        public String getAlarmKey() {
            return alarmKey;
        }
    }
}
public class AlarmClass {

    public static class Monitor{
        public static final String alarmKeyA = "alarm_" + TestEnumClass.ITEM.ITEMA.getName();
        public static final String alarmKeyB = "alarm_" + TestEnumClass.ITEM.ITEMB.getName();
    }
}
public class TestPO {

    private String name;
    private Double rate;

    public TestPO(String name, Double cityName2) {
        this.name = name;
        this.rate = rate;
    }
}

定时任务类中的静态代码块:

    static {
        System.out.println(TestEnumClass.ITEM.ITEMA.getName());
        TestPO testPO = new TestPO(TestEnumClass.ITEM.ITEMA.getName(),
                TestEnumClass.ITEM.ITEMA.getValue());
        System.out.println(1234);
    }

debug项目,一直报错:

 Instantiation of bean failed; nested exception is java.lang.ExceptionInInitializerError
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1236) ~[spring-beans-5.0.6.RELEASE.jar:5.0.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance

后来发现:AlarmClass中的Monitor与TestEnumClass的ITEM存在互相依赖问题!!!

为什么要这么写呢,是想是使alarmKey的后半部分与ITEM中的name保持一致,这样以后修改一处即可。

解决方法:

方法1:AlarmClass中把Monitor内部类去掉,直接写alarmKeyA,alarmKeyB,这样也是报同样的错,说明与内部类无关。

方法2,新建:

public class SystemConstant {

    public static final String ITEMA = "ITEMA";
    public static final String ITEMB = "ITEMB";

}

AlarmClass中的Monitor、TestEnumClass的ITEM,都使用SystemConstant中的ITEMA、ITEMB即可,使他们解耦,这样既实现了目的,也不会报错!

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页