2017-05-08 2 views
0

Dans notre environnement Prod aujourd'hui nous avons vu NPE suivante:NullPointerException dans Hash Carte

Caused by: java.lang.NullPointerException 
    at java.util.HashMap$TreeNode.putTreeVal(HashMap.java:1970) 
    at java.util.HashMap.putVal(HashMap.java:637) 
    at java.util.HashMap.put(HashMap.java:611) 

Nous avons utilisé null comme une clé dans notre carte, mais comme par docs il est permis en java. J'essaie de comprendre s'il y a un moyen quelconque que la méthode put produise NPE ou non, car nous devons donner la cause racine appropriée pour la même chose.

Si quelqu'un a une idée à ce sujet comme méthode put peut lancer NPE s'il vous plaît partager.

+1

pouvez-vous nous montrer votre code s'il vous plaît? –

+4

Cela ressemble à une condition de concurrence. Accédez-vous à la carte à partir de plusieurs threads? – Axel

+0

Pourriez-vous fournir un [mcve] pour reproduire ce cas? Ce serait bien de voir comment vous générez cette exception d'exécution. – AxelH

Répondre

1

Si vous utilisez java 8, vous obtiendrez NPE pour null en tant que clé.

Voir le bug à https://bugs.openjdk.java.net/browse/JDK-8046085

+2

@AxelH le bug ne se produit que lorsque la carte passe en mode arbre en raison d'un nombre élevé de collisions, et la version corrigée est 9. Donc, il a été corrigé, mais en Java 9, pas en Java 8. Aussi, vous semblez pense que OpenJDK est une sorte d'implémentation exotique de Java. Ce n'est pas. C'est le JDK standard que tout le monde utilise, sur lequel travaillent les gens d'Oracle. –

+0

Il est déjà corrigé dans Java8, vérifiez les "backports" du correctif: java8u26, c'est 2014. La version actuelle est 1.8.0_131-b11. Cela peut donc arriver si vous n'avez pas mis à jour le JRE depuis (ce qui n'est pas inhabituel dans les environnements de production) –