web-dev-qa-db-fra.com

Java HashMap get méthode null pointeur exception

J'ai un code similaire au suivant: -

class A
{
  private HashMap<Character, Boolean> myMap;
  public A()
  {
    myMap = new HashMap<Character, Boolean>();
    String mychars = "asdfzxcvqwer";
    for ( char c : mychars.toCharArray() )
        myMap.put(c, true);
  }
  public doo(String input)
  {
    StringBuilder output = new StringBuilder();
    for ( char c : input.toCharArray() )
    {
      if ( myMap.get(c) )
         output.append(c);
    }
  }
  ...
  ...
}

J'obtiens une exception de pointeur nul sur la ligne if ( myMap.get(c) ) - Qu'est-ce que je fais mal?

14
user277465

Si c n'est pas contenu dans myMap, il renverra null, qui ne peut pas être décompressé en tant que boolean.

Essayez:

Boolean b = myMap.get(c);
if(b != null && b){
...
46
xlecoustillier

Si myMap ne contient pas de clé correspondant à c, alors myMap.get(c) renverra null. Dans ce cas, lorsque la JVM déballe ce qu'elle attend d'être un Java.lang.Boolean objet dans une primitive boolean pour exécuter la condition, il trouve un objet nul et lance donc un Java.lang.NullPointerException.

Le bloc suivant est équivalent à ce que vous avez dans votre exemple et devrait faciliter la compréhension de la raison pour laquelle vous auriez un NullPointerException:

if (((Boolean) myMap.get(c)).booleanValue()) 

Je réécrirais votre condition d'origine comme:

if ( myMap.containsKey(c) )

J'espère que ça aide.

12
Nuno Guerreiro

Changement

if ( myMap.get(c) )

à

if ( myMap.containsKey(c) && myMap.get(c))
6
Jiji

Changer cela

for ( char c : input.toCharArray() )
{
  if ( myMap.get(c) )
     output.append(c);
}

Pour ça

for ( char c : input.toCharArray() )
{
  if ( myMap.containsKey(c) )
     output.append(c);
}

Utilisera la méthode définie de la carte pour vérifier si une certaine clé est enregistrée sur la carte. Je laisse le for tel quel, puisque vous semblez vouloir vérifier un groupe de clés.

myMap.get(c) renvoie la valeur associée à cette clé, ou null si la clé n'est pas enregistrée.

En remarque, n'oubliez pas que si vous utilisez cette méthode avec des objets personnalisés, vous devrez redéfinir les méthodes hashcode et equals.

Suggestion: je suggère simplement ceci à partir d'une idée distante que j'ai, si ce n'est pas une interprétation correcte de votre code, ignorez-le. Si votre carte contient uniquement une valeur booléenne pour déterminer si une certaine valeur "est contenue" ou non, je vous suggère fortement d'utiliser à la place un HashSet car une carte n'a aucun sens dans ce contexte.

3
Fritz

S'il n'y a pas d'entité avec le Character requis dans la carte, alors map.get(key) retourne null et à l'intérieur de l'instruction if, cela conduit au lancement de NullPointerException.

3
bellum

Un coup de couteau dans l'obscurité: y a-t-il une entrée dans votre carte pour le caractère particulier assigné à c? S'il n'y en a pas, Java peut essayer de déballer une valeur nulle ...

3
Dan Vinton

Votre code est très compliqué.

  • do est un mot-clé réservé, ne l'utilisez pas comme nom de méthode.
  • une expression 'if' doit renvoyer un booléen, et non null.
  • l'initialisation de myMap n'est pas correctement écrite

Voici une version de travail:

import Java.util.HashMap;

public class A {
    private HashMap<Character, Boolean> myMap;

    public A() {
        this.myMap = new HashMap<Character, Boolean>();
        String mychars = "asdfzxcvqwer";
        for ( char c : mychars.toCharArray() )
            myMap.put(c, true);
    }

    public String execute(String input) {
        StringBuilder output = new StringBuilder();
        for ( char c : input.toCharArray() )
        {
            if ( this.myMap.get(c) != null )
                output.append(c);
        }
        return output.toString();
    }


    public static void main(String[] args) {
        A test = new A();
        test.execute("abc");
    }
}
2