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?
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){
...
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.
Changement
if ( myMap.get(c) )
à
if ( myMap.containsKey(c) && myMap.get(c))
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.
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
.
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 ...
Votre code est très compliqué.
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");
}
}