案例解析:使用IDEA异常断点来定位java.lang.ArrayStoreException的问题

栏目: Java · 发布时间: 5年前

内容简介:最近对 base-spring-boot (启动程序时抛出如下异常,导致启动失败单纯看异常栈,无法定位问题原因,只能看到是在调用

最近对 base-spring-boot ( https://github.com/ronwxy/base-spring-boot) 项目进行了升级。在将其用于应用开发中时遇到 java.lang.ArrayStoreException 的异常导致程序无法启动。平常开发过程中面对这种描述不够清楚,无法定位具体原因的问题该如何处理?本文分享通过使用IDEA异常断点来定位此类问题的方法。

启动程序时抛出如下异常,导致启动失败

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'devGlobalExceptionHandler' defined in class path resource [cn/jboost/springboot/autoconfig/error/exception/ExceptionHandlerAutoConfiguration.class]: Post-processing of merged bean definition failed; nested exception is java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:570) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:843) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:877) ~[spring-context-5.1.7.RELEASE.jar:5.1.7.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549) ~[spring-context-5.1.7.RELEASE.jar:5.1.7.RELEASE]
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142) ~[spring-boot-2.1.5.RELEASE.jar:2.1.5.RELEASE]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775) [spring-boot-2.1.5.RELEASE.jar:2.1.5.RELEASE]
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) [spring-boot-2.1.5.RELEASE.jar:2.1.5.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:316) [spring-boot-2.1.5.RELEASE.jar:2.1.5.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260) [spring-boot-2.1.5.RELEASE.jar:2.1.5.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248) [spring-boot-2.1.5.RELEASE.jar:2.1.5.RELEASE]
	at com.cnbot.kindergarten.CnbotKindergartenApplication.main(CnbotKindergartenApplication.java:10) [classes/:na]
Caused by: java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy
	at sun.reflect.annotation.AnnotationParser.parseClassArray(AnnotationParser.java:724) ~[na:1.8.0_201]
	at sun.reflect.annotation.AnnotationParser.parseArray(AnnotationParser.java:531) ~[na:1.8.0_201]
	at sun.reflect.annotation.AnnotationParser.parseMemberValue(AnnotationParser.java:355) ~[na:1.8.0_201]
	at sun.reflect.annotation.AnnotationParser.parseAnnotation2(AnnotationParser.java:286) ~[na:1.8.0_201]
	at sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:120) ~[na:1.8.0_201]
	at sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:72) ~[na:1.8.0_201]
	...

单纯看异常栈,无法定位问题原因,只能看到是在调用 devGlobalExceptionHandler 创建bean时出错,错误信息 java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy 。这属于框架内部抛出的异常,通常的设置断点Debug的方法很难定位到具体原因,可通过IDEA的异常断点来进行定位,它会在程序运行过程中出现指定异常时进行阻断。

1. 添加异常断点

在IDEA的Debug面板中,点击“View Breakpoints”(两个重叠的红色圈按钮),如下

案例解析:使用IDEA异常断点来定位java.lang.ArrayStoreException的问题

打开“Breakpoints”窗口,在该窗口中点击“+”按钮,选择“Java Exception Breakpoints”, 如下图

案例解析:使用IDEA异常断点来定位java.lang.ArrayStoreException的问题

然后在弹出的“Enter Exception Class”窗口中输入 ArrayStoreException 选中对应异常,依次点击OK,Done按钮即完成异常断点添加。

2. 程序debug

开始以Debug模式启动程序。 程序运行后,在前面配置的异常出现时,将会进行阻断,如图

案例解析:使用IDEA异常断点来定位java.lang.ArrayStoreException的问题

可以看到程序阻断在上图高亮的那行代码处,异常便是从这里抛出的。查看 parseClassValue 方法,可看到这里有catch TypeNotPresentException 异常,并且包装成我们在异常栈看到的 TypeNotPresentExceptionProxy 返回。离真相很近了。

我们可以在上述catch块中添加一个断点,查看异常包装前的状态,如图

案例解析:使用IDEA异常断点来定位java.lang.ArrayStoreException的问题

重新Debug运行,将定位到上图代码处,查看异常,看到如下图所示信息

案例解析:使用IDEA异常断点来定位java.lang.ArrayStoreException的问题

该信息表示 org.springframework.security.access.AccessDeniedException 这个类不存在,导致 BaseWebApplicationExceptionHandler 类型的bean实例化时出错。这时候问题基本已经定位到了。

查看源码,在BaseWebApplicationExceptionHandler中有对AccessDeniedException的统一处理,但是spring-boot-autoconfigure所有的依赖都是optional的(不会传递依赖),而在新开发的项目中,并没有引入spring-security,因此导致 AccessDeniedException 这个类找不到而报错。目前通过去掉该部分处理解决。

总结

IDEA的Debug支持好几种断点类型,如前文介绍的异常断点,以及比较常用的条件断点等。当无法从异常栈信息找到问题所在时,借用这些类型的断点进行Debug,往往事情就变得简单了。

我的个人博客地址: http://blog.jboost.cn

我的头条空间: https://www.toutiao.com/c/user/5833678517/#mid=1636101215791112

我的github地址: https://github.com/ronwxy

我的微信公众号:jboost-ksxy

————————————————————————————————————————

案例解析:使用IDEA异常断点来定位java.lang.ArrayStoreException的问题 欢迎关注我的微信公众号,及时获取最新分享


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Computer Age Statistical Inference

Computer Age Statistical Inference

Bradley Efron、Trevor Hastie / Cambridge University Press / 2016-7-21 / USD 74.99

The twenty-first century has seen a breathtaking expansion of statistical methodology, both in scope and in influence. 'Big data', 'data science', and 'machine learning' have become familiar terms in ......一起来看看 《Computer Age Statistical Inference》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

在线进制转换器
在线进制转换器

各进制数互转换器

URL 编码/解码
URL 编码/解码

URL 编码/解码