2010-08-17 7 views
1

J'ai une fonction remplissant un HashMap (rMap) de tableaux de chaînes. Une fois que certaines conditions sont remplies par exemple r.Map.size() != 0 je puis, dans un autre fichier (rMap est une variable globale) appelez le String array[] = rMap.get(0) suivant de ce que je tente de System.out.println(array[0]).Pointeur nul lors du déplacement de données

C'est l'exécution du programme et j'obtiens un pointeur nul à System.out.println(array[0]);. Quelqu'un a des idées pourquoi cela arrive?

EDIT: Je remplissais la carte comme si ..

String center[] = new String[] { tname, tmessage, tlink, tsname }; 
Global.rMap.put(index, center); 

Lorsque toutes les valeurs du tableau sont des variables qui sont des chaînes. Donc, la valeur que j'y accède tname et ce n'est pas égal à null. J'ai vérifié. Ma valeur de clé est une chaîne

+0

pourriez-vous ajouter juste un peu plus de code, afin que nous puissions voir explicitement à quoi vous définissez l'index? – atk

Répondre

0

HashMap autorise les valeurs NULL, de sorte que la valeur que vous obtenez avec String array[] =rMap.get(0); peut être nulle. Accéder au tableau null alors lève le NPE.

1

Comment remplissez-vous la carte? Êtes-vous certain de mettre une entrée non nulle avec une clé Integer dans la clé?

Eh bien, nous pouvons être assez certains que vous ne l'êtes pas. Raisons possibles:

  • Une erreur dans le code de remplissage qui se traduit par l'intention incluez pas en cours d'exécution ou d'une valeur de clé différente
  • Vous utilisez Short ou Byte objets comme les clés
  • Vous êtes mettre une valeur null dans la carte sous la 0 clé

Vous pouvez répondre à cette question pour vous-même en exécutant le code dans un débogueur et regardant le contenu de la carte.

Mise à jour:

Ma valeur clé est une chaîne

Eh bien, c'est votre problème là. rMap.get(0) recherchera un Integer, et il ne correspondra pas à l'entrée pour une chaîne "0".

+0

Mise à jour mon code pour refléter votre question. – Skizit

+0

@Meowmix: Mise à jour de la réponse pour refléter votre mise à jour. –

1

La référence array est null, probablement parce qu'aucune valeur (ou un null) n'a été ajoutée à rMap, avec la clé 0.

Si possible, utilisez des génériques pour vous assurer que vos clés sont du bon type. Vous pouvez également imprimer les valeurs de la carte avant d'aller chercher array pour voir ce qui se trouve sur la carte. Passer à travers le code avec un débogueur, avec une montre sur le rMap montrera également ce que la carte contient et quand il est changé.

0

La méthode get() de Hashmap utilise une clé, pas un index, pour identifier la valeur que vous voulez obtenir. Si vous voulez une liste ordonnée d'éléments, vous devez utiliser une sous-classe List (ou appliquer la commande, vous-même). Si vous voulez utiliser une Hashmap, utilisez la méthode keys() pour obtenir une énumération de toutes les clés de la carte.

(retiré texte ci-dessus, en raison à la question des éclaircissements. Laissant ci-dessous texte, même si ce n'est pas le problème, il est une considération importante)

En outre, vous aurez besoin d'être très prudent de ne pas créer conditions de course, puisque vous travaillez sur des threads. Bien que le Hashtable natif de Java soit synchronisé, cela ne signifie pas que les données y figurent. C'est-à-dire, vous pouvez MyObj obj = get (xxx) dans un htread, Nd commencer à manipuler l'obj dans deux threads séparés, éventuellement en marchant les uns sur les autres. En fonction de votre application, vous pouvez utiliser Hashtable.remove() pour que les données soient supprimées de la carte et ne puissent pas être réutilisées, ou vous pouvez avoir besoin de blocs synchronisés (remove() peut bien être l'implémentation la plus simple, thoguh vous devez gérer avec élégance les conditions où la carte contient d'abord des données, puis les données ont disparu).

0

C'est un problème lorsque vous invoquez la méthode get de l'implémentation de Map, la signature de la méthode get de java.util.Map est get (java.lang.Object), ainsi, tout objet sera accepté comme argument.

La clé qui fonctionne correctement est de passer une chaîne (valeur = 0) en tant que clé ou remplace le hashCode et égale les méthodes de l'objet argument qui n'est pas un objet java.lang.String.

Questions connexes