项目运行时,有时候会遇到异常
java.lang.ArrayStoreException
,导致进程启动失败,但是从异常信息并不能直接看出来是什么原因。
问题表现
Spring Boot启动失败,错误异常栈如下:
java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy
at java.lang.Class.createAnnotationData(Class.java:3521) [6 skipped]
at java.lang.Class.annotationData(Class.java:3510)
at java.lang.Class.getAnnotations(Class.java:3446)
at org.springframework.core.type.StandardAnnotationMetadata.<init>(StandardAnnotationMetadata.java:70)
解决方法
-
使用IDE的异常断点
异常断点设置
断点停在方法: sun.reflect.annotation.AnnotationParser#parseClassArray
private static Object parseClassArray(int var0, ByteBuffer var1, ConstantPool var2, Class<?> var3) {
Class[] var4 = new Class[var0];
boolean var5 = false;
byte var6 = 0;
for(int var7 = 0; var7 < var0; ++var7) {
var6 = var1.get();
if (var6 == 99) {
//断点停在这里,其中var3是ZyMonitorAutoConfiguration类
var4[var7] = (Class)parseClassValue(var1, var2, var3);
} else {
skipMemberValue(var6, var1);
var5 = true;
}
}
return var5 ? exceptionProxy(var6) : var4;
}
进入parseClassValue可以看出来
private static Object parseClassValue(ByteBuffer var0, ConstantPool var1, Class<?> var2) {
int var3 = var0.getShort() & '\uffff';
try {
try {
String var4 = var1.getUTF8At(var3);
return parseSig(var4, var2);
} catch (IllegalArgumentException var5) {
return var1.getClassAt(var3);
}
} catch (NoClassDefFoundError var6) {
return new TypeNotPresentExceptionProxy("[unknown]", var6);
} catch (TypeNotPresentException var7) {
return new TypeNotPresentExceptionProxy(var7.typeName(), var7.getCause());
}
}
- 在
new TypeNotPresentExceptionProxy
打断点后,可以发现如下错误
java.lang.TypeNotPresentException: Type com.***.MessageSender not present
从整个分析来说,是加载ZyMonitorAutoConfiguration的时候,没有找到类MessageSender
。引入了对应的jar包后,问题解决
网友评论