• java spring 等启动项目时的异常 或 程序异常的解决思路


    今天搭建ssm项目的时候,因为pagehelper的一个jar包没有导入idea的web项目下的lib目录中,异常报错找不到pagehelper,这个问题在出异常的时候疯狂crash,让人心情十分不舒服、沮丧、急躁、有脾气,https://www.zhihu.com/question/22924738/answer/23103484 这里是深入解除这种状态,并解决这种程序crash时出现负面情绪的方法和解决程序crash的方法。

    不过今天倒是让我的耐心得到了很大的提升,同时让我对解决这类启动项目时的配置文件或jar包导致的异常有了一点的解决思路,同时对普通的异常也有了更好的解决思路。

    注注注注注注注注注注意: 不要只看console,异常可不只是出现在console呐,有时候会出现在tomcat log和tomcat console这两个窗口里,这三个输出窗口都是挨着的,如果在console里没出现异常,那就去其他两个看看,一般真出问题了会抛出异常的(当然,我说的是idea)。

    普通的异常可以用debug快速定位

    启动项目时的异常解决思路:

    首先定位根本异常在哪,也就是第一个出异常的位置,因为它会导致后面相关依赖的组件出现一系列的异常,所以在

    出现异常的1~3 行进行定位,通常只需要看异常出现后的第一行的末尾就行了,这个就是根异常,只要解决这个异常,一般情况下所有的异常都会解决。

    比如这次的 pagehelper导致的异常

    因为我的异常信息已经没了,所以copy一份网上的别人的异常作为讲解示例:

    示例来源:https://github.com/pagehelper/Mybatis-PageHelper/issues/20

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in file [E:JAVAeclipse2017workplacevcgo-managervcgo-manager-service	argetclassesspringapplicationContext-dao.xml]: Invocation of init method failed; nested exception is org.springframework.core.NestedIOException: Failed to parse config resource: class path resource [mybatis/SqlMapConfig.xml]; nested exception is org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias 'com.github.pagehelper.PageInterceptor'.  Cause: java.lang.ClassNotFoundException: Cannot find class: com.github.pagehelper.PageInterceptor
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:753)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538)
        at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:446)
        at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:328)
        at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
        at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4939)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5434)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
    Caused by: org.springframework.core.NestedIOException: Failed to parse config resource: class path resource [mybatis/SqlMapConfig.xml]; nested exception is org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias 'com.github.pagehelper.PageInterceptor'.  Cause: java.lang.ClassNotFoundException: Cannot find class: com.github.pagehelper.PageInterceptor
        at org.mybatis.spring.SqlSessionFactoryBean.buildSqlSessionFactory(SqlSessionFactoryBean.java:434)
        at org.mybatis.spring.SqlSessionFactoryBean.afterPropertiesSet(SqlSessionFactoryBean.java:340)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)
        ... 21 more
    Caused by: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias 'com.github.pagehelper.PageInterceptor'.  Cause: java.lang.ClassNotFoundException: Cannot find class: com.github.pagehelper.PageInterceptor
        at org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration(XMLConfigBuilder.java:109)
        at org.apache.ibatis.builder.xml.XMLConfigBuilder.parse(XMLConfigBuilder.java:92)
        at org.mybatis.spring.SqlSessionFactoryBean.buildSqlSessionFactory(SqlSessionFactoryBean.java:428)
        ... 24 more
    Caused by: org.apache.ibatis.builder.BuilderException: Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias 'com.github.pagehelper.PageInterceptor'.  Cause: java.lang.ClassNotFoundException: Cannot find class: com.github.pagehelper.PageInterceptor
        at org.apache.ibatis.builder.BaseBuilder.resolveClass(BaseBuilder.java:103)
        at org.apache.ibatis.builder.xml.XMLConfigBuilder.pluginElement(XMLConfigBuilder.java:142)
        at org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration(XMLConfigBuilder.java:100)
        ... 26 more
    Caused by: org.apache.ibatis.type.TypeException: Could not resolve type alias 'com.github.pagehelper.PageInterceptor'.  Cause: java.lang.ClassNotFoundException: Cannot find class: com.github.pagehelper.PageInterceptor
        at org.apache.ibatis.type.TypeAliasRegistry.resolveAlias(TypeAliasRegistry.java:117)
        at org.apache.ibatis.builder.BaseBuilder.resolveAlias(BaseBuilder.java:130)
        at org.apache.ibatis.builder.BaseBuilder.resolveClass(BaseBuilder.java:101)
        ... 28 more
    Caused by: java.lang.ClassNotFoundException: Cannot find class: com.github.pagehelper.PageInterceptor
        at org.apache.ibatis.io.ClassLoaderWrapper.classForName(ClassLoaderWrapper.java:190)
        at org.apache.ibatis.io.ClassLoaderWrapper.classForName(ClassLoaderWrapper.java:89)
        at org.apache.ibatis.io.Resources.classForName(Resources.java:256)
        at org.apache.ibatis.type.TypeAliasRegistry.resolveAlias(TypeAliasRegistry.java:113)
        ... 30 more

    看这里第一行的末尾:

    Cause: java.lang.ClassNotFoundException: Cannot find class: com.github.pagehelper.PageInterceptor

    从这里就可以看出来,是因为找不到 class: com.github.pagehelper.PageInterceptor 导致的,因为找不到这个,进而使前面一系列的使用到的组件出现异常,

    比如我自己的前面就出现了 mapper依赖注入失败的异常 抛出 Error creating bean with name mapper,导致我一下午都是各种搜索异常,其实这样根本就是没有思路的乱搞,

    总之,一般情况下一定要先找到根异常(那个最根本原因的异常,一般在第一行的末尾),找到那个异常之后就要看那个异常是什么,分析因为这个异常导致了哪些一系列的异常,

    然后再去搜索这个异常的原因是什么,像这次pagehelper找不到,我就应该直接去看pagehelper的issue,看看有没有类似的问题,或者google:github issue xxxx,这种用关键字

    来定位问题的方法,然后pagehelper的作者回答了原因就是因为找不到jar包,进而让我想到了idea下的 maven web应用必须单独导入jar包到项目的 /WEB-INF/lib目录下,所以put一下就能正常运行了

    总之遇到异常,不要慌,要冷静的一步一步排查,查找错误的根本原因,

    对于这种配置类的异常很多可能是路径问题,比如很多路径都必须使用 classpath: xxx,

    还有就是idea下的maven web项目 必须单独导入jar包到项目的 /WEB-INF/lib目录下 put就行了,所以以后每次我要导入新的maven仓库jar包的话,我都必须put一次,保证jar包在lib下

    然后就是定位异常必须定位到根异常(通常是最开始的那个异常的第一行的末尾),只要解决这个异常,基本上相关所有的这条运行线路就通了

    ===============

    python的根异常跟java的位置相反,是在trash的最后一行开始

    ===============

    下面是那篇知乎文章的备份:

    作者:吴涛
    链接:https://www.zhihu.com/question/22924738/answer/23103484
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    程序崩溃时,有些人一语不发眉头紧皱,有些人咬着指甲前后摇晃,有些人喃喃自语唉声叹气,有些人叉手望天若有所思,还有些人……特别烦躁想砸键盘 :)

    在大多数人的编程生涯里面,「烦躁」都是会在某个阶段出现的正常情绪。但「想砸键盘」则是因为你的烦躁感需要通过破坏物品才能得到宣泄,而这是性格的一部分,跟你的成长经历有关,跟写程序无关。如果你觉得这是个问题,请咨询心理医师,如果不觉得是个问题,它就不是个问题,只要你不要像那个玩不到 Unreal 就真的砸键盘的德国小孩一样狂暴。

    那么「烦躁」从何而来?能写好程序的人基本上都是 control freak,而 control freak 不能容忍局面不在自己的掌控之中,具体来说就是 crash 了却不知道为什么。所以烦躁基本上来自于「因为不知所措而带来的挫折感」,而要减少失控的挫折感的法门,就是全面而细致地了解编程的各个方方面面:要了解你所选择的技术——包括它的设计哲学、它的历史、它的标准、它的实现、它的社区、它的代码库、它的发布方法、它的包管理系统;还要熟悉你的编辑器,熟悉你的编译器,熟悉你的 REPL,熟悉你的 debugger,熟悉你的操作系统,熟悉你的硬件架构;乃至摸清楚你所书写程序需要解决的问题领域,进而去了解这一领域所处的行业、这一行业的现状、历史和未来走向。知道得越多,你就越不可能在程序崩溃的时候无所适从:大部分时候你会知道它为什么崩溃,而如果你不知道为什么,也对于怎样才能找到答案了然于心。到那个时候你就很少会因为程序崩溃而烦躁了。而到达那个境界之前,你可以用诸如「烦躁不会让我更快地思考,所以对于解决问题没有帮助」或者「感觉到烦躁说明我正在自己的 comfortable zone 之外,这是一种扩展,我必须与自己对抗」之类的想法来疏导情绪。当然我也没有到达上面描述的那个境界,每次感觉到烦躁的时候我就会想,每个人都是会孤独地死去的,何必呢。
  • 相关阅读:
    idea系列---【测试一段代码执行时间,每次都得复制粘贴,idea如何设置自定义模板代码?】
    我爱java系列---【java8时间类Instant】
    我爱java系列---【Java比较浮点数的正确方式】
    idea系列---【idea常用快捷键大全】
    linux系列---【linux系统如何创建一个软/硬连接?】
    vue系列---【vue项目如何使用element-ui的弹框提示?】
    vue系列---【vue项目中element-ui如何实现在登陆之前进行预校验?校验通过才允许调后台接口】
    vue系列---【vue项目中element-ui如何实现点击重置按钮,重置表单数据?】
    vue系列---【element-ui如何给表单添加参数验证?】
    面对对象的随笔
  • 原文地址:https://www.cnblogs.com/kinome/p/9113017.html
Copyright © 2020-2023  润新知