6 控制台报错信息分析:
1 单个类报错信息分析:
at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:276) ~[validation-api-1.1.0.Final.jar:na]
1 一个类信息
2 括号前:类的路径 + 方法名 > 类所在的包路径.类名.方法名
3 括号内:类名 + 报错行,可以直接点到报错行,最常用
4 括号后:依赖的jar名称
2 单个异常报错信息分析
1 报错的异常
2 异常的说明
3 报错业务流程所涉及的类
4 业务逻辑:自下而上 读类
5 省略了多少个框架:... 20 common frames omitted,省略了20个公共框架,啥意思?不懂
3 多个异常分析
1 后面的异常一般都是诱发异常,就像多米诺积木,一个倒了,后面的都倒了
2 查看异常发生的整个业务流程,可以帮助我们理解,这个业务功能是在做什么,有什么用,为什么要这么做
从而能够帮助我们限定错误的范围,联想错误的诱因,从业务功能的角度上去理解,联系,找到,和定位错误的根本原因
有时候不从功能和业务的角度,很多理解具体是什么原因
3 自上而下读业务逻辑
4 把问题放到具体场景,业务,功能,框架里去看
现象:
1 这个异常一共有 A > Z7 33个类,
2 A,B,C,D 四个异常
3 A结束(异常抛出) = B开始,B结束(异常抛出) = C开始,C结束(异常抛出) = D开始
4 读异常逻辑:A开始 > A结束 > B开始 > B结束 > C开始 > C结束 > D开始 > D结束 :A>B>C>D,读是顺序调用和编写代码的逻辑,返回是逆序系统响应的逻辑
5 读类的逻辑:A>B>C>D>E>F>G>H>I>J>K>L>M>N>O>P>Q>R>S>T>U>V>W>X>Y>Z>Z1>Z2>Z3>Z4>Z5>Z6>Z7
6 异常产生的顺序:异常D 最先产生 > 异常C > 异常B > 异常A 最后产生 :D>C>B>A,异常的产生对于逻辑层是逆序,但其实还是顺序对于返回的逻辑来说调用的
7 异常业务的位置:异常D 逻辑最里层,最底层,最终一个类 > 异常C 上面一层 > 异常B 上面一层 > 异常A 业务逻辑的入口,开始的地方,最外层,最上面
8 线程的执行路线:调用阶段(开发,编写) A > B > C > D 顺序,响应阶段(运行,生产) D > C > B > A 逆序,顺逆是对于开发者而言
总结:
查看业务逻辑:多个异常:接口自上而下。单个异常:类自下而上
表象异常:第一个异常A,有时是最容易让人理解和猜测和联想的异常,最靠近业务,功能入口,可能更容易的表现是哪个业务,功能让开发者理解
根本异常:最后一个异常D,也是根本问题出现的地方,虽然是根本问题,但有时候但从异常描述,不可能理解问题的业务,功能场景
意义:怎么看异常信息,怎么根据异常信息读业务逻辑,怎么根据业务逻辑联想问题发生的场景,如何快速确定根本问题
难点:看不懂异常信息,看不懂的代码,读不懂业务逻辑,不理解的业务,联想不到功能或应用场景 -- 就很难知道是什么问题,就很难解决问题
原因:就是菜,技术菜,见的少了,积累少了
例子:场景:使用validation 做参数校验
遇到下面这个异常,虽然最后通过更换spring的版本从2.4.1 更换到 2.2.2.RELEASE,解决了
下面这个异常只看了下面这么多,别的一点都没看,也不懂具体为什么,就尝试着去改版本试试,当然可能是运气好
Error creating bean with name 'defaultValidator' defined in class path resource
[org/springframework/boot/autoconfigure/validation/ValidationAutoConfiguration.class]:
我觉得是spring版本的问题,但是真的就是这样吗,我不知道,因为我不知道根本原因,看不懂业务逻辑
有些问题的深层次原理确实超出了当前的能力,就像使用工具一样,不需要会造,懂造,只需要会用
解决问题也同样适用,真正的原理可能永远都不懂,但有时候可以解决,或者是覆盖解决
总结:但是这有时候不影响解决问题,能从异常信息多get一点信息,有时候就多一丝解决问题的可能,多一种解决问题的途径
异常A org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'defaultValidator' defined in class path resource [org/springframework/boot/autoconfigure/validation/ValidationAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.validation.beanvalidation.LocalValidatorFactoryBean]: Factory method 'defaultValidator' threw exception; nested exception is javax.validation.ValidationException: Unable to instantiate Configuration.
U 异常A产生 at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:658) ~[spring-beans-5.3.2.jar:5.3.2]
T at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:486) ~[spring-beans-5.3.2.jar:5.3.2]
S at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1336) ~[spring-beans-5.3.2.jar:5.3.2]
R at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1179) ~[spring-beans-5.3.2.jar:5.3.2]
Q at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:571) ~[spring-beans-5.3.2.jar:5.3.2]
P at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:531) ~[spring-beans-5.3.2.jar:5.3.2]
O at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.2.jar:5.3.2]
N at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.2.jar:5.3.2]
M at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.2.jar:5.3.2]
L at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.2.jar:5.3.2]
K at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:944) ~[spring-beans-5.3.2.jar:5.3.2]
J at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:923) ~[spring-context-5.3.2.jar:5.3.2]
I at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:588) ~[spring-context-5.3.2.jar:5.3.2]
H at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144) ~[spring-boot-2.4.1.jar:2.4.1]
G at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767) ~[spring-boot-2.4.1.jar:2.4.1]
F at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) ~[spring-boot-2.4.1.jar:2.4.1]
E at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426) ~[spring-boot-2.4.1.jar:2.4.1]
D at org.springframework.boot.SpringApplication.run(SpringApplication.java:326) ~[spring-boot-2.4.1.jar:2.4.1]
C at org.springframework.boot.SpringApplication.run(SpringApplication.java:1309) ~[spring-boot-2.4.1.jar:2.4.1]
B at org.springframework.boot.SpringApplication.run(SpringApplication.java:1298) ~[spring-boot-2.4.1.jar:2.4.1]
A 异常A业务开始 at com.example.qiyue.QiYueApplication.main(QiYueApplication.java:14) ~[classes/:na]
异常B Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.validation.beanvalidation.LocalValidatorFactoryBean]: Factory method 'defaultValidator' threw exception; nested exception is javax.validation.ValidationException: Unable to instantiate Configuration.
V 异常B产生 at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.3.2.jar:5.3.2]
U 异常B业务开始 at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) ~[spring-beans-5.3.2.jar:5.3.2]
... 20 common frames omitted
异常C Caused by: javax.validation.ValidationException: Unable to instantiate Configuration.
Z3 异常C产生 at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:279) ~[validation-api-1.1.0.Final.jar:na]
Z2 at org.springframework.boot.validation.MessageInterpolatorFactory.getObject(MessageInterpolatorFactory.java:53) ~[spring-boot-2.4.1.jar:2.4.1]
Z1 at org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration.defaultValidator(ValidationAutoConfiguration.java:60) ~[spring-boot-autoconfigure-2.4.1.jar:2.4.1]
Z at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
Y at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
X at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
W at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
V 异常C业务开始 at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.3.2.jar:5.3.2]
... 21 common frames omitted
异常D Caused by: java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1
Z7 异常D产生 at org.hibernate.validator.internal.util.Version.getJavaRelease(Version.java:36) ~[hibernate-validator-5.2.0.Final.jar:5.2.0.Final]
Z6 at org.hibernate.validator.internal.engine.ConfigurationImpl.<init>(ConfigurationImpl.java:119) ~[hibernate-validator-5.2.0.Final.jar:5.2.0.Final]
Z5 at org.hibernate.validator.internal.engine.ConfigurationImpl.<init>(ConfigurationImpl.java:95) ~[hibernate-validator-5.2.0.Final.jar:5.2.0.Final]
Z4 at org.hibernate.validator.HibernateValidator.createGenericConfiguration(HibernateValidator.java:31) ~[hibernate-validator-5.2.0.Final.jar:5.2.0.Final]
Z3 异常D业务开始 at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:276) ~[validation-api-1.1.0.Final.jar:na]
... 28 common frames omitted
--以下内容都是刚开始的猜想和尝试:主要是过程,有很多错误的理解
问题:
1 哪些类会展示出来:一个异常信息的开始类,和终止类,过程类,以什么为开始类,以什么为终止类,过程类需要有哪些
2 为什么会有多个异常信息
猜测:开始类:HTTP请求处理的类,每一个异常开始的类定义这个到底该怎么确定?
终止类:异常发生的地方,所在的类
过程类:请求处理的类开始,到异常发生的类结束,所有被线程调用的类
猜测:1 因为异常处理了就不影响程序的运行,也就是线程可以继续往下执行,直到终点,再原业务流程返回,最终返回响应,这个操作或者业务中产生的多个异常
都没有关系都是被处理的,都是可以被记录的
2 项目启动异常:启动失败了,
3 需求:需要创建A对象
A 对象里引用了B,那么就需要B对象,开发者在A中定义了一个异常,找不到B或者创建不了A的异常
B 对象里引用了C, 那么就需要C对象,在创建C对象时有一段业务逻辑,可能是转型,空值,界限等等异常
C 对象里引用了D,C里有个方法处理对象D,处理的过程中出现了异常
D 有个方法处理了数据库逻辑,这个方法被C调用了,方法内出现了异常,数据不存在等
那么创建A这段业务,可以只出现一个异常,B,C,D都没有问题,创建不了B的异常
也可以有两个,或者多个异常,就是A,B,C,D都出现异常
展示的类和顺序:
1 如果A类有异常,异常信息只出现A类,即使业务流程调用了B,C,D
2 如果B类有异常,那么异常信息出现A,B两个类,即使A类没有出现异常,但是A类在异常出现的生命周期内,也就是异常是通过A的调用才产生
也就是A类调用B的地方是异常发生过程中的一个节点,但是C,D虽然是整个业务线程的生命周期内,但是却不在异常产生的生命周期内,所以不需要
展示的顺序是 第一行 B类,第二行A类,每一个异常第一行展示的都是发生的点,下面都是产生过程中调用的节点,越近越先展示
3 如果B,D两个类有异常,那么展示的异常是顺序是 异常D,异常B, 展示的类是顺序是D,C,B,A
异常D
D,C,B,A
异常B
B,A
如果按照这样理解B,A类就展示了两次,这样是正确合理,事实上是像猜测的这样吗?
出现两次其实是可以接受和解释的,类虽然出现两次,但是出现异常的代码行可能不是同一行
多个异常:
1 以异常分割,每一个异常为独立的一块异常信息
2 流程先后,或者外和里:猜测,需要证实
1 对于多个异常而言,最后抛出的异常,最先展示
2 对于一个异常而言,最后引发的异常代码,最先展示
4 结论:A > B > C > D > E > F > G > H 这条涉及8个类的一条线程业务流程中,出现了C,E,H 三个异常,那么异常信息展示如下
异常H
类H > G > F > E > A
异常E
类E > D > C > H
异常C
类C > B > E
异常:业务线程深浅程度理解:业务线程最深产生的异常最先展示
异常发生先后顺序理解:业务流程最先产生的异常最先展示
原因:这个异常其实是主要异常,后续的异常可能都是因为这个异常,从而引发的异常,也就是主要问题和根本问题,所以应该,也要最先展示
类 :业务线程深浅程度理解:业务线程产生的异常的类最先展示
原因:这个异常主要是因为这个类产生的,这个类中的逻辑是主要问题和根本问题,所以应该最先,最先展示
现象:一个异常:类的业务流程逻辑
类的展示自上而下 顺序是逆着业务流程
类的展示自下而上 顺序是业务流程的调用
自上而下:找方法调用在代码行的位置:上一个报错类的方法体的名称,就下一个类
上一个报错类的方法体的名称,就是在下一个类报错代码行处被调用
重点:如果你按照方法调用的流程,点进去,一般都是进入到一个接口,如果直接点报错行,就是接口的具体实现类
多个异常:异常的产生流程逻辑
异常 H 结束的类E,就是异常E 开始的类 E, 除去A,因为A是程序的入口
异常 E 结束的类C,就是异常C 开始的类
3 多个异常分析
--错误 》1 第一个异常是主要异常和根本异常(错误,第一个异常从先后顺序是最后一个异常,但是从业务深浅是最外层一个异常)
2 下面的异常一般都是诱发异常,就像积木,一个倒了,后面的都倒了,
--错误3 从下面一个异常,最下面一个类,自下而上,可以查看整个业务流程
4 查看异常发生的整个业务流程,可以帮助我们理解,这个业务功能是在做什么,有什么用,为什么要这么做
从而能够帮助我们限定错误的范围,联想错误的诱因,从业务功能的角度上去理解,联系,找到,和定位错误的根本原因
5 后面一个异常:业务开始的类。是当前异常:业务出错的地方,异常产生的地方,也就是第一个类,那么当前异常业务开始的类,也就是当前整个流程业务最先开始的地方
6 自上而下读业务逻辑
5 应用
1 找到报错方法体
2 找到报错类
3 找到报错业务逻辑
4 查看整个业务的流程:类与类之间的关联和方法调用
5 根据上一个类方法名,找到类报错行.方法名,找到实现的是哪个接口,