当前位置:   article > 正文

java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy排查

java.lang.arraystoreexception: sun.reflect.annotation.typenotpresentexceptio

1、java.lang.ArrayStoreException这个的debug借助IDEA,添加Java Exception的java.lang.ArrayStoreException断点,这样异常时能够看到具体的报错Class

2、首先进入错误debug的是org.springframework.cloud.netflix.eureka.config.EurekaDiscoveryClientConfigServiceBootstrapConfiguration

因为这个版本没有使用远程config,所以ConfigServicePropertySourceLocator的类是找不到,所以报了异常。

继续排查是能发现这个是BootstrapApplicationListener中的bootstrapServiceContext方法处理,异常是忽略的。

这个也是误导了自己,耗时有点长。debug可以看下面2图。

 

3、再次进入的是项目中的GlobalExceptionHandler类,原因也是出在这个类中。

这个类是common模块中的统一异常处理类,其他同事做的权限security,AccessDeniedException在security的jar中。

  1. @ExceptionHandler(AccessDeniedException.class)
  2. public ObjectRestResponse accessDeniedrExceptionHandler(HttpServletResponse response, Exception ex) {
  3. logger.error(ex.getMessage(), ex);
  4. ObjectRestResponse restResponse = new ObjectRestResponse();
  5. restResponse.setStatus(CodeStatus.PARAM_ACCESS_FORBIDDEN.getValue());
  6. restResponse.setMsg(CodeStatus.PARAM_ACCESS_FORBIDDEN.getName());
  7. return restResponse;
  8. }

而该module中的pom进行了exclusion,而yunlian-truck-auth-client模块中间接引用common模块,所以导致GlobalExceptionHandler找不到AccessDeniedException类。

  1. <dependency>
  2. <groupId>com.sinochem.yunlian.truck</groupId>
  3. <artifactId>yunlian-truck-auth-client</artifactId>
  4. <version>1.0-SNAPSHOT</version>
  5. <exclusions>
  6. <exclusion>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-security</artifactId>
  9. </exclusion>
  10. </exclusions>
  11. </dependency>

该异常在refresh方法中进行了throw出来。

 

总结:针对java.lang.ArrayStoreException这样的异常通过IDEA进行进行debug,以及EurekaDiscoveryClientConfigServiceBootstrapConfiguration中的这个异常处理。

---------------------------------------------------------------

具体是java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy 数组越界的异常,为什么是class不存在导致的,是AnnotationParser.parseClassValue把异常包装成为Object。

下面解释来自https://yq.aliyun.com/articles/616541

仔细看下代码,可以发现AnnotationParser.parseClassValue把异常包装成为Object

  1. //sun.reflect.annotation.AnnotationParser.parseClassValue(ByteBuffer, ConstantPool, Class<?>)
  2. private static Object parseClassValue(ByteBuffer buf,
  3. ConstantPool constPool,
  4. Class<?> container) {
  5. int classIndex = buf.getShort() & 0xFFFF;
  6. try {
  7. try {
  8. String sig = constPool.getUTF8At(classIndex);
  9. return parseSig(sig, container);
  10. } catch (IllegalArgumentException ex) {
  11. // support obsolete early jsr175 format class files
  12. return constPool.getClassAt(classIndex);
  13. }
  14. } catch (NoClassDefFoundError e) {
  15. return new TypeNotPresentExceptionProxy("[unknown]", e);
  16. }
  17. catch (TypeNotPresentException e) {
  18. return new TypeNotPresentExceptionProxy(e.typeName(), e.getCause());
  19. }
  20. }

然后在sun.reflect.annotation.AnnotationParser.parseClassArray(int, ByteBuffer, ConstantPool, Class<?>)里尝试直接设置到数组里

  1. // sun.reflect.annotation.AnnotationParser.parseClassArray(int, ByteBuffer, ConstantPool, Class<?>)
  2. result[i] = parseClassValue(buf, constPool, container);

而这里数组越界了,ArrayStoreException只有越界的Object的类型信息,也就是上面的

java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/555897
推荐阅读
相关标签
  

闽ICP备14008679号