2011-11-02 4 views
2

StrSubstitutorクラスを利用するために私はcommons-lang3-3.0.1.jarを使用しています。次のコードは、私のSyncAdapterから呼び出されたAndroidでApache Commons libを使用したときの奇妙な動作

...アウトこれを確認し、それがStrSubstitutorを構築するクラッシュ:

public static String makeGetPlansQueryString(Bundle params) 
{ 
    Map<String, String> valuesMap = new HashMap<String, String>(); 

    valuesMap.put(REQUEST_PARAM_APIUSERNAME, API_USERNAME); 
    valuesMap.put(REQUEST_PARAM_APIPASSWORD, API_PASSWORD); 
    //... etc. etc. 

    String xmlTemplate = VendApplication.getContext().getString(R.string.XMLREQUEST_GET_PLANS); 
    StrSubstitutor subst = new StrSubstitutor(valuesMap); // <-- Crashes in here. 
    return subst.replace(xmlTemplate); 
} 

エラー出力:私はこの1行を追加する場合

11-02 14:36:08.439: ERROR/AndroidRuntime(9244): FATAL EXCEPTION: SyncAdapterThread-1 
    11-02 14:36:08.439: ERROR/AndroidRuntime(9244): java.lang.ExceptionInInitializerError 
    11-02 14:36:08.439: ERROR/AndroidRuntime(9244):  at com.conducthq.android.vend.webapi.WebAPIRequestHelper.makeGetPlansQueryString(WebAPIRequestHelper.java:68) 
    11-02 14:36:08.439: ERROR/AndroidRuntime(9244):  at com.conducthq.android.vend.webapi.WebAPIClient.createHTTPRequest(WebAPIClient.java:121) 
    11-02 14:36:08.439: ERROR/AndroidRuntime(9244):  at com.conducthq.android.vend.webapi.WebAPIClient.processRequest(WebAPIClient.java:55) 
    11-02 14:36:08.439: ERROR/AndroidRuntime(9244):  at com.conducthq.android.vend.webapi.SyncAdapter.onPerformSync(SyncAdapter.java:39) 
    11-02 14:36:08.439: ERROR/AndroidRuntime(9244):  at android.content.AbstractThreadedSyncAdapter$SyncThread.run(AbstractThreadedSyncAdapter.java:163) 
    11-02 14:36:08.439: ERROR/AndroidRuntime(9244): Caused by: java.lang.ExceptionInInitializerError 
    11-02 14:36:08.439: ERROR/AndroidRuntime(9244):  at org.apache.commons.lang3.text.StrMatcher.stringMatcher(StrMatcher.java:206) 
    11-02 14:36:08.439: ERROR/AndroidRuntime(9244):  at org.apache.commons.lang3.text.StrSubstitutor.<clinit>(StrSubstitutor.java:112) 
    11-02 14:36:08.439: ERROR/AndroidRuntime(9244):  ... 5 more 
    11-02 14:36:08.439: ERROR/AndroidRuntime(9244): Caused by: java.lang.NullPointerException 
    11-02 14:36:08.439: ERROR/AndroidRuntime(9244):  at org.apache.commons.lang3.StringUtils.<clinit>(StringUtils.java:717) 
    11-02 14:36:08.439: ERROR/AndroidRuntime(9244):  ... 7 more 

を私のHomeActivity(アプリケーション起動時に起動)に転送すると、上記のコードは完全に動作します。

StrSubstitutor sub = new StrSubstitutor(new HashMap<String, String>()); 

奇妙な権利ですか?この行は、別の時点で別のスレッドで実行されている異なるコードにどのように影響しますか?この上にいくつかの光を当てることができる任意のAndroidの看護師?私は知らないいくつかの奇妙なAndroid JARロードバグはありますか? @ _ @

私はLG-P350でAndroid 2.1 SDKを使用しています。私はStrSubstitutorのApache Commons API docのスーパーシンプルなサンプルコードでこの動作を再現しました:http://commons.apache.org/lang/api-3.0.1/org/apache/commons/lang3/text/StrSubstitutor.html

答えて

1

あなたのクラッシュは現在のスレッドからコンテキストクラスローダを取得しようとするStringUtilsの静的初期化子にありますjava.text.Normalizer $ Formクラスを取得しようとしています。だから、nullを返すgetContextClassLoader()のいくつかのファンキーな問題です。

更新

エラーが明らかにthis bugで述べたので、私はあなただけで強制的にコンテキストクラスローダを設定することができ、あなたは問題ないはず推測されます。

Thread.currentThread().setContextClassLoader(this.getClassLoader()); 
+0

ありがとう、これが修正されました。 –