2017-06-08 16 views
0

私のAndroidアプリケーションでは、ConcurrentHashMapを使用しています。ただ、get操作、そして流れの上に積み重ねjava.util.concurrent.ConcurrentHashMap.get()throw StackOverflowError

デバイスモデル:。NX511J アンドロイドOS:5.1.1 のAndroid SDK:ここでは22

がフルスタックトレースは次のとおりです。

java.lang.StackOverflowError: stack size 1036KB 

(13000 same stack trace) 

    at java.util.concurrent.ConcurrentHashMap$ForwardingNode.find(ConcurrentHashMap.java:1507) 
    at java.util.concurrent.ConcurrentHashMap$ForwardingNode.find(ConcurrentHashMap.java:1515) 
    at java.util.concurrent.ConcurrentHashMap$ForwardingNode.find(ConcurrentHashMap.java:1515) 
    at java.util.concurrent.ConcurrentHashMap$ForwardingNode.find(ConcurrentHashMap.java:1515) 
    at java.util.concurrent.ConcurrentHashMap$ForwardingNode.find(ConcurrentHashMap.java:1515) 
    at java.util.concurrent.ConcurrentHashMap$ForwardingNode.find(ConcurrentHashMap.java:1515) 
    at java.util.concurrent.ConcurrentHashMap$ForwardingNode.find(ConcurrentHashMap.java:1515) 
    at java.util.concurrent.ConcurrentHashMap$ForwardingNode.find(ConcurrentHashMap.java:1515) 
    at java.util.concurrent.ConcurrentHashMap$ForwardingNode.find(ConcurrentHashMap.java:1515) 
    at java.util.concurrent.ConcurrentHashMap$ForwardingNode.find(ConcurrentHashMap.java:1515) 
    at java.util.concurrent.ConcurrentHashMap$ForwardingNode.find(ConcurrentHashMap.java:1515) 
    at java.util.concurrent.ConcurrentHashMap$ForwardingNode.find(ConcurrentHashMap.java:1515) 
    at java.util.concurrent.ConcurrentHashMap$ForwardingNode.find(ConcurrentHashMap.java:1515) 
    at java.util.concurrent.ConcurrentHashMap$ForwardingNode.find(ConcurrentHashMap.java:1515) 
    at java.util.concurrent.ConcurrentHashMap$ForwardingNode.find(ConcurrentHashMap.java:1515) 
    at java.util.concurrent.ConcurrentHashMap$ForwardingNode.find(ConcurrentHashMap.java:1515) 
    at java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:754) 
    at com.tmall.wireless.minsk.internal.store.impl.ConfigStoreImpl.c(ConfigStoreImpl.java:526) 
    at com.tmall.wireless.minsk.internal.store.impl.ConfigStoreImpl.a(ConfigStoreImpl.java:461) 
    at mwo.a(MinskImpl.java:265) 
    at jfd.a(TMConfigCenterManager.java:186) 
    at ogf.c(TMRewriteEngine.java:177) 
    at ogf$1.run(TMRewriteEngine.java:141) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
    at java.lang.Thread.run(Thread.java:818) 

ソースコードを(私はそれが問題を使用していないと思う):

private final ConcurrentMap<String, Module> immutableLocalCache = new ConcurrentHashMap<>(); 
    private Module getFromLocal(String moduleName) { 
     Module module = immutableLocalCache.get(moduleName);// Stack over flow 
     if (null != module) { 
      return module; 
     } 
     //... 
     try { 
      Module ret = MinskDataConvertUtils.createMinskModule(data); 
      immutableLocalCache.put(ret.name, ret); 
      return ret; 
     } catch (Exception e) { 
      LogUtils.exception(e); 
      return null; 
     } 
    } 
+0

あなたのコードといくつかのコンテキストを投稿できますか?スタックトレースから何が起こったのかを言うのは難しいです。 – pablochan

+0

@pablochan android 5.1.1、単なる単純な呼び出し、何も違う – teaey

+0

あなたはそのマップにいくつのエントリを持っていますか? – pablochan

答えて

0

一般的な原因は、スタックのオーバーフローが悪い再帰呼び出しまたは条件を渡しているループで編集。通常、これは再帰関数が正しい終了条件を持たない場合に発生します。そのため、永久に呼び出しを終了します。

操作を取得するために反復処理または再帰を使用している可能性があります。ループを使用している場合は、指定した条件をチェックします。 まだエラーは解決しておらず、コードを投稿しています。

+0

実際に再帰を呼び出さない – teaey

+0

あなたのコードを共有してください。 –

+0

ソースコードを更新しました。 – teaey