Skip to content
Advertisement

Unboxing may produce Null Pointer Exception after checking if key exists in Map

Android Studio gives the warning: Unboxing of 'idCollisonMap.get(currentId)' may produce 'NullPointerException' even though I am checking if the key exists before I perform the Map.get().

Am I actually in danger of running into a null pointer exception? My understanding is that .containsKey() check would prevent this from happening.

Map<String, Integer> idCollisonMap = new HashMap<>();

// All IDs to map
for (MyObject object : objectsWithIdList) {

    // Use the id as the key
    String currentId = object.getId();

    // First check if the ID is null
    if (currentId != null) {
        if (idCollisonMap.containsKey(currentId)) {
            // This ID already exists in the map,  increment value by 1
            idCollisonMap.put(currentId, idCollisonMap.get(currentId) + 1);
        } else {
            // This is a new ID,  create a new entry in the map
            idCollisonMap.put(currentId, 1);
        }
    }
}

Code snippet sample output:

[{T143=1, T153=3, T141=1}]

Advertisement

Answer

Assuming nothing else is modifying the map, and if the map never contains null values, this looks safe to me – but you can avoid the warning and be more efficient at the same time, by unconditionally calling get and using the result to handle missing keys as well:

Integer currentCount = idCollisionMap.get(currentId);
Integer newCount = currentCount == null ? 1 : currentCount + 1;
idCollisionMap.put(newCount);
User contributions licensed under: CC BY-SA
3 People found this is helpful
Advertisement