java.lang.ExceptionInInitializerError的解決方法

 這個錯誤是說變量初始化出現問題,一般出如今靜態變量尤爲是單例模式。這種問題每每是初始化順序不對形成的,下面舉個簡單的例子。java

[java] view plaincoandroid

  1. import java.util.HashMap;  app

  2. import java.util.Map;  oop

  3.   

  4. public class Example {  spa

  5.   

  6.     private static Example example = new Example();  .net

  7.       

  8.     private static Map<Integer,Boolean> test =   code

  9.         new HashMap<Integer, Boolean>();  orm

  10.       

  11.     private Example()  對象

  12.     {  blog

  13.         test.put(1true);  

  14.     }  

  15.       

  16.     public static Example getInstance()  

  17.     {  

  18.         return example;  

  19.     }  

  20. }  

      若是你在別的類調用getInstance,就會報錯ExceptionInInitializerError。這是由於類加載時不會爲實例變量賦值,對象建立時不會爲靜態變量賦值。咱們調用getInstance時,此類就開始加載,加載的時候不會爲實例變量賦值,可是會按順序給靜態變量賦值,因此先爲example賦值,而後爲test賦值即初始化。但爲example賦值時出現了個小插曲,它會調用構造方法建立一個對象。對象建立時不會爲靜態變量test賦值,而構造器內卻已經調用test,因而報錯了。

改成:

[java] view plaincopy

  1. private static Map<Integer,Boolean> test =   

  2.         new HashMap<Integer, Boolean>();  

  3. private static Example example = new Example();  

就能夠了


可是在實際的開發中,可能會遇到以下的bug:

java.lang.ExceptionInInitializerError
	at com.tencent.connect.auth.QQAuth.createInstance(ProGuard:54)
	at com.tencent.tauth.Tencent.(ProGuard:49)
	at com.tencent.tauth.Tencent.createInstance(ProGuard:59)
	at cn.app.activity.news.News_Login.onCreate(News_Login.java:93)
	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1149)
	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1792)
	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1847)
	at android.app.ActivityThread.access$1500(ActivityThread.java:176)
	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1040)
	at android.os.Handler.dispatchMessage(Handler.java:130)
	at android.os.Looper.loop(Looper.java:384)
	at android.app.ActivityThread.main(ActivityThread.java:3971)
	at java.lang.reflect.Method.invokeNative(Native Method)
	at java.lang.reflect.Method.invoke(Method.java:538)
	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:978)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:732)
	at dalvik.system.NativeStart.main(Native Method)

這是在引用其餘jar包時出現的錯誤,怎麼辦呢?最好的解決辦法就是加try catch。

相關文章
相關標籤/搜索