Ответ 1
Это связано с тем, что HashMap.put(key, value)
вернет предыдущее значение, связанное с ключом, или значение null.
В вашем коде вы не можете вернуть freq.put(key,1)
как int, потому что оно равно null.
Я получаю исключение 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.
Кто-нибудь из вас знает, что я могу делать неправильно?
Это связано с тем, что HashMap.put(key, value)
вернет предыдущее значение, связанное с ключом, или значение null.
В вашем коде вы не можете вернуть freq.put(key,1)
как int, потому что оно равно null.
add метод возвращает int. int - примитивный тип данных, который не может быть нулевым. freq.put(key, 1) возвращает null, поэтому он генерирует исключение. изменить тип возвращаемого значения метода add на Integer или добавить нулевую проверку.
так как 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.