1. 程式人生 > >java.lang.NoClassDefFoundError異常處理

java.lang.NoClassDefFoundError異常處理

1.異常資訊:

Caused by: java.lang.NoClassDefFoundError: com/pingan/cfss/monitor/user/controller/UserInfoController$2
at com.pingan.cfss.monitor.user.controller.UserInfoController.getUserList(UserInfoController.java:84) ~[cfss_monitor_user/:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_92]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_92]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_92]
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_92]
at com.pingan.pafa.papp.esa.annotation.MethodESA.invokeMethod(MethodESA.java:148) ~[pafa5-dubbox-5.3.13.jar:?]
at com.pingan.pafa.papp.esa.annotation.MethodESA.perform(MethodESA.java:59) ~[pafa5-dubbox-5.3.13.jar:?]
... 36 more

2.通用的排查方法

遇到這種異常不外呼兩種情況

1.classpath裡沒有對應的class檔案

2.有class檔案,但是載入靜態類時,初始化靜態方法報錯。

3.問題解決過程

遇到後,猜想:我們生產環境肯定沒人刪除依賴包的怎麼會少class檔案,直接把1忽略了,又結合程式碼,2也被忽略了,此時就懵逼了(UserInfoController這個類已經被載入了,為啥UserInfoController$2會找不到?)。

當時就在本地想了一個辦法,先把應用啟動起來,然後把target全部刪掉,發現報了一模一樣的錯誤。(問題終於被確定,是1少class)

確定後就去生產伺服器檢視lib包,果然什麼都沒有,後來經過排查,是運維人員的定時備份日誌指令碼把lib也備份了(因為pafa的依賴包是放在和日誌同目錄的子目錄裡)

4.心得:

不要隨隨便忽略任何細節,除非你有確鑿的證據