{"record":{"id":"077664cb40499b4f","repo":"pinpoint-apm/pinpoint","slug":"nullpointerexception-077664","errorCode":null,"errorMessage":"NullPointerException","messagePattern":"NullPointerException","errorType":"exception","errorClass":"java.lang.NullPointerException","httpStatus":null,"severity":"error","filePath":"commons-profiler/src/main/java/com/navercorp/pinpoint/common/profiler/concurrent/jsr166/ConcurrentWeakHashMap.java","lineNumber":887,"sourceCode":"    public boolean containsKey(Object key) {\n        int hash = hash(key.hashCode());\n        return segmentFor(hash).containsKey(key, hash);\n    }\n\n    /**\n     * Returns <tt>true</tt> if this map maps one or more keys to the\n     * specified value. Note: This method requires a full internal\n     * traversal of the hash table, and so is much slower than\n     * method <tt>containsKey</tt>.\n     *\n     * @param value value whose presence in this map is to be tested\n     * @return <tt>true</tt> if this map maps one or more keys to the\n     *         specified value\n     * @throws NullPointerException if the specified value is null\n     */\n    public boolean containsValue(Object value) {\n        if (value == null)\n            throw new NullPointerException();\n\n        // See explanation of modCount use above\n\n        final Segment<K,V>[] segments = this.segments;\n        int[] mc = new int[segments.length];\n\n        // Try a few times without locking\n        for (int k = 0; k < RETRIES_BEFORE_LOCK; ++k) {\n            int sum = 0;\n            int mcsum = 0;\n            for (int i = 0; i < segments.length; ++i) {\n                int c = segments[i].count;\n                mcsum += mc[i] = segments[i].modCount;\n                if (segments[i].containsValue(value))\n                    return true;\n            }\n            boolean cleanSweep = true;\n            if (mcsum != 0) {","sourceCodeStart":869,"sourceCodeEnd":905,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/commons-profiler/src/main/java/com/navercorp/pinpoint/common/profiler/concurrent/jsr166/ConcurrentWeakHashMap.java#L869-L905","documentation":"This concurrent map does not permit null values, so containsValue(Object value) throws NullPointerException immediately when value is null instead of returning false. This is the standard java.util.concurrent contract (matching ConcurrentHashMap).","triggerScenarios":"Calling map.containsValue(null) — commonly via Collection.contains(null) on map.values() or searching values for a nullable variable.","commonSituations":"Passing a method parameter or lookup result that is null into containsValue; calling values().contains(nullableVar) expecting false like HashMap does.","solutions":["Check for null before calling containsValue and treat null as 'not present'","Do not use values().contains(null); write an explicit null check","If nulls must be representable, switch to a map implementation that allows null values (e.g. HashMap) with external synchronization"],"exampleFix":"// before\nboolean found = map.containsValue(maybeNull);\n// after\nboolean found = maybeNull != null && map.containsValue(maybeNull);","handlingStrategy":"type-guard","validationCode":"boolean safeContains(ConcurrentWeakHashMap<K,V> map, V v) { return v != null && map.containsValue(v); }","typeGuard":"boolean nonNull(Object o) { return o != null; }","tryCatchPattern":"try { return map.containsValue(value); } catch (NullPointerException e) { return false; }","preventionTips":["Remember all java.util.concurrent maps reject null keys and null values","Null-check values coming from external lookups before membership tests","Avoid values().contains(nullable) patterns"],"tags":["java","concurrency","nullpointerexception"],"backgroundTag":"null-argument","analyzedSha":"744c3d3075e595656abb1ae331ad2c0e4c9eb996","analyzedAt":"2026-09-07T18:48:45.289Z","contentChangedAt":"2026-09-07T18:48:45.289Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}