今天搭建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 之外,這是一種擴展,我必須與自己對抗」之類的想法來疏導情緒。當然我也沒有到達上面描述的那個境界,每次感覺到煩躁的時候我就會想,每個人都是會孤獨地死去的,何必呢。