Подтвердить что ты не робот

Исключение NullPointerException при добавлении в HashMap

Я получаю исключение NullPointerException при добавлении данных в HashMap. Я пишу класс для подсчета заданных частот определенных объектов. Вот мой код (лишенный лишних деталей):

public class FrequencyCounter {

    private Map<Object, Integer> freq;

    public FrequencyCounter() {
        freq = new HashMap<Object, Integer>();
    }

    public int add(Object key) {        
        System.out.println("Map is null: " + (freq == null));
        System.out.println("Key is null: " + (key == null));
        if (freq.containsKey(key)) {
            return freq.put(key, freq.get(key) + 1);
        }
        return freq.put(key, 1);
    }

    public static void main(String[] args) {
        FrequencyCounter fc = new FrequencyCounter();
        fc.add(new Object());
    }
}

NPE происходит на линии return freq.put(key, 1); Оба оператора println печатают false.

Кто-нибудь из вас знает, что я могу делать неправильно?

4b9b3361

Ответ 1

Это связано с тем, что HashMap.put(key, value) вернет предыдущее значение, связанное с ключом, или значение null. В вашем коде вы не можете вернуть freq.put(key,1) как int, потому что оно равно null.

Ответ 2

add метод возвращает int. int - примитивный тип данных, который не может быть нулевым. freq.put(key, 1) возвращает null, поэтому он генерирует исключение. изменить тип возвращаемого значения метода add на Integer или добавить нулевую проверку.

Ответ 3

так как put() может возвращать значение null, поэтому вы должны изменить тип возвращаемого значения на Integer, который может иметь значение null:

public Integer add(Object key) {        
    System.out.println("Map is null: " + (freq == null));
    System.out.println("Key is null: " + (key == null));
    if (freq.containsKey(key)) {
        return freq.put(key, freq.get(key) + 1);
    }
    return freq.put(key, 1);
}

и перед его использованием необходимо проверить возвращаемое значение для null.