前幾天在寫一個攔截器的時候,使用到了StringUtils這個工具類,但是使用postman模擬請求的時候,dispatcherServlet 一直報異常。斷點調試,之前的語句一直沒有問題,但是一旦調用StringUtils.blank()方法,就直接跳到異常處理模塊。當時非常驚訝,這條語句本身是沒有加try catch塊處理的,為什么會直接跳到dispatcherServlet 的異常處理模塊。疑惑之下,我在junit 單元測試中使用了該方法,絲毫沒有問題,當時就感覺有點玄學。
@Test public void testfun2(){ String str = null; if(StringUtils.isBlank(str)){ System.out.println("null"); }else{ System.out.println("not null"); } }
后來實在想不出為什么了,就老老實實地完整地調試了一遍。在catch塊中發現了java.lang.NoClassDefFoundError這個錯誤,找不到定義的類,可是編譯沒有任何錯誤,我也能看到這個類的代碼呀,一臉茫然,於是趕緊搜資料,才發現了其中的原因:
1、NoClassDefFoundError錯誤的發生,是因為Java虛擬機在編譯時能找到合適的類,而在運行時不能找到合適的類導致的錯誤。
2、在J2EE的環境下工作時得到NoClassDefFoundError的異常,而且對應的錯誤的類是確實存在的,這說明這個類對於類加載器來說,可能是不可見的。
既然類對於類加載器來說可能是不可見的,那么簡單暴力的方法,根據tomcat的類加載機制,可以直接將對應的jar包添加到WEB-INF下的lib下。測試了一下,沒有報異常了。
其中參考文章鏈接:https://blog.csdn.net/jamesjxin/article/details/46606307,文章對NoClassDefFoundError和ClassNotFoundException的區別進行了講解,並詳細講解了NoClassDefFoundError的原因以及其解決方案。
但是依然有一個疑問,為什么在junit 中運行該類沒有問題,在Spring啟動運行的時候卻會出問題呢?
