java.lang.NoClassDefFoundError: Could not initialize class異常處理


借鑒:http://blog.csdn.net/sleepdancer/article/details/9207425
static { InputStream in = XXX.class.getResourceAsStream("/conf/abc.properties"); try { prop.load(in); } catch (IOException e) { e.printStackTrace(); } }
應用程序跑的時候,突然報出來Caused by: Java.lang.NoClassDefFoundError: Could not initialize class com.xxx.xxx.XXX錯誤,當時第一反應就是.NoClassDefFoundError,肯定是類找不到了。於是趕緊看看代碼,發現使用類的調用處沒有任何的編譯錯誤,這樣的話就很迷惑了,為什么會NoClassDefFoundError錯誤呢。重新編譯檢查了一遍之后,還是報出來同樣的錯誤,於是后面的錯誤信息引起了注意【Could not initialize】。

 

           不能初始化,也就是類在new的時候出現了問題,於是仔細檢查了一下不能初始化的類,發現是個靜態工具類,根本就沒有什么構造函數,那么沒有構造函數何來的初始化異常?於是仔細的檢查了一下代碼之后,發現異常可能出現在這個地方了。

關鍵就在第一行的 InputStream in = XXX.class.getResourceAsStream("/conf/abc.properties");,如果沒有abc.properties的話,肯定會出現異常,這樣的話就會造成了初始化錯誤。當然比較奇怪的時候,既然try了,為什么不把第一行的代碼也放到try里面,這樣的話,即使有錯誤,也會能夠順利的進行初始化操作。

后來博主應該發現是properties文件未能找到,那么Java web里面如何找到也是個問題,下面是解決辦法,用classLoader來解決:

//private static FileInputStreamfis=null;

private static InputStream is=null;

 

pp=new Properties();

                try {

                     //此句會找不到,有java.io.FileNotFoundException:

                     //fis=newFileInputStream("XXX.properties"); // 一般情況下默認讀取為tomcat目錄

                     //當我們使用java web的時候,讀取文件要使用類加載器[因為類加載器去讀取資源的時候,默認的主目錄是src]

                is=SQLHelper.class.getClassLoader().getResourceAsStream("com/demo/util/XXX.properties");

                     pp.load(is);

                     dbDriver=pp.getProperty("dbDriver");

                     url=pp.getProperty("url");

                     username=pp.getProperty("username");

                     password=pp.getProperty("password");

      } catch (IOException e) { e.printStackTrace(); } 

注意:在Linux下用部分編輯器編輯文件有可能造成Java程序解析出錯。如在web控制台項目中,一次在param.properties文件中添加一條記錄,但由於使用記事本編輯器,造成加載工具類時報錯不能初始化。


免責聲明!

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



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