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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM