2017-06-08 2 views
0

Dans mon application Android, j'utilise un ConcurrentHashMap. Juste une opération get, pile puis sur les fluxjava.util.concurrent.ConcurrentHashMap.get() throw StackOverflowError

Modèle de l'appareil:. NX511J Android OS: 5.1.1 SDK Android: 22

Voici la trace complète de la pile:

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) 

code source (Je pense que ce n'est pas problème à l'aide):

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

Pouvez-vous poster votre code, ainsi que du contexte? Il est difficile de dire ce qui s'est passé juste à partir de la trace de la pile. – pablochan

+0

@pablochan android 5.1.1, juste une simple invocation, rien de différent – teaey

+0

Combien d'entrées avez-vous sur cette carte? – pablochan

Répondre

0

La cause commune pour un débordement de pile est un mauvais appel récursif ou d'une condition que vous avez passe ed dans la boucle. Généralement, cela se produit lorsque vos fonctions récursives n'ont pas la condition de terminaison correcte, de sorte qu'il finit par s'appeler pour toujours.

Peut-être que vous itérez ou utilisez la récursivité pour obtenir des opérations. Si vous utilisez une boucle, vérifiez la condition que vous avez donnée. L'erreur persiste toujours, puis publiez votre code.

+0

effectivement aucune récursivité invoquer – teaey

+0

pouvez-vous s'il vous plaît partager votre code –

+0

J'ai mis à jour le code source. – teaey