今天搭建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:\JAVA\eclipse2017workplace\vcgo-manager\vcgo-manager-service\target\classes\spring\applicationContext-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 之外,这是一种扩展,我必须与自己对抗」之类的想法来疏导情绪。当然我也没有到达上面描述的那个境界,每次感觉到烦躁的时候我就会想,每个人都是会孤独地死去的,何必呢。