zoukankan      html  css  js  c++  java
  • java异常信息分析

    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 根据上一个类方法名,找到类报错行.方法名,找到实现的是哪个接口,

  • 相关阅读:
    github上fork的项目,如何同步原作者更新的内容?
    设计模式-简单工厂模式详解
    设计模式-建造者模式详解
    设计模式-原型模式详解
    设计模式-单例模式详解
    SqlServer断开所有连接
    Winform重写键盘按键事件
    从拖拉控件编程到面向设计编程(一)
    Springboot vue 前后分离 跨域 Activiti6 工作流 集成代码生成器 shiro权限
    java 微信自定义菜单 java微信接口开发 公众平台 SSM redis shiro 多数据源
  • 原文地址:https://www.cnblogs.com/jianyi12/p/14265172.html
Copyright © 2011-2022 走看看