今天下午使用这个枚举类一直报错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即可,使他们解耦,这样既实现了目的,也不会报错!