Исключение нулевого указателя метода Java HashMap get

у меня есть код, подобный следующему :-

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);
    }
  }
  ...
  ...
}

Я получаю исключение нулевого указателя на строку if ( myMap.get(c) ) -- что я делаю не так?

7 ответов


если c Не содержит myMap, он вернется null, который не может быть распакован как boolean.

попробуй :

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

если myMap не содержит ключа, который соответствует c, потом myMap.get(c) возвращают значение null. В этом случае, когда JVM распаковывает то, что он ожидает быть java.lang.Boolean объект в boolean примитив для выполнения условия, он находит нулевой объект и поэтому бросает java.lang.NullPointerException.

следующий блок эквивалентен тому, что у вас есть в вашем примере, и должен облегчить понимание того, почему у вас будет NullPointerException:

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

Я бы переписал ваш оригинал условие как:

if ( myMap.containsKey(c) )

надеюсь, это поможет.


изменить

if ( myMap.get(c) )

to

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

если нет сущности с требуемым Character в карте, то map.get(key) возвращает null и внутри if заявление это приводит к NullPointerException метания.


удар в темноте: есть ли запись на вашей карте для конкретного символа, назначенного c? Если нет, Java может пытаться распаковать нулевое значение...


изменение этого

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

для этого

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

будет использовать определенный метод Карты, чтобы проверить, зарегистрирован ли определенный ключ на карте. Я ухожу for как есть, так как вы, похоже, хотите проверить группу ключей.

myMap.get(c) возвращает значение, связанное с этим ключом, или null если ключ не зарегистрирован.

в качестве примечания помните, что если вы используете этот метод с пользовательскими объектами, вам придется переопределить hashcode и equals методы.

предложение: я просто предлагаю это из отдаленной идеи, которую у меня есть, если это не правильная интерпретация вашего кода, просто игнорируйте его. Если ваша карта содержит только логическое значение, чтобы определить, содержится ли определенное значение "или нет", я настоятельно рекомендую вам использовать HashSet вместо этого, потому что карта не делает никакого смысла в этом контексте.


ваш код очень грязный.

  • сделать-это зарезервированное ключевое слово, не используйте его в качестве имени метода.
  • выражение " if " должно возвращать логическое значение, а не null.
  • инициализация myMap написана неправильно

вот рабочая версия :

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");
    }
}