這個錯誤是說變量初始化出現問題,一般出如今靜態變量尤爲是單例模式。這種問題每每是初始化順序不對形成的,下面舉個簡單的例子。java
[java] view plaincoandroid
import java.util.HashMap; app
import java.util.Map; oop
public class Example { spa
private static Example example = new Example(); .net
private static Map<Integer,Boolean> test = code
new HashMap<Integer, Boolean>(); orm
private Example() 對象
{ blog
test.put(1, true);
}
public static Example getInstance()
{
return example;
}
}
若是你在別的類調用getInstance,就會報錯ExceptionInInitializerError。這是由於類加載時不會爲實例變量賦值,對象建立時不會爲靜態變量賦值。咱們調用getInstance時,此類就開始加載,加載的時候不會爲實例變量賦值,可是會按順序給靜態變量賦值,因此先爲example賦值,而後爲test賦值即初始化。但爲example賦值時出現了個小插曲,它會調用構造方法建立一個對象。對象建立時不會爲靜態變量test賦值,而構造器內卻已經調用test,因而報錯了。
改成:
[java] view plaincopy
private static Map<Integer,Boolean> test =
new HashMap<Integer, Boolean>();
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。