Loading... (original) (raw)

FULL PRODUCT VERSION :
java version "1.8.0_05"
Java(TM) SE Runtime Environment (build 1.8.0_05-b13)
Java HotSpot(TM) Client VM (build 25.5-b02, mixed mode, sharing)

ADDITIONAL OS VERSION INFORMATION :
Microsoft Windows [Version 6.1.7601]

A DESCRIPTION OF THE PROBLEM :
Changes to improve HashMap performance in Java 8 can cause HashMap.put() with a null key to throw a NullPointerException. This problem did not occur in Java 7.

Caused by: java.lang.NullPointerException
at java.util.HashMap$TreeNode.putTreeVal(HashMap.java:1970)
at java.util.HashMap.putVal(HashMap.java:637)
at java.util.HashMap.put(HashMap.java:611)

It looks like the line of code in question is
else if ((pk = p.key) == k || (pk != null && k.equals(pk)))

Probably k.equals(pk) is source of the NullPointerException where k is null.
Possibly fix is change it to pk.equals(k).

REGRESSION. Last worked in version 7u17

STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Problem occurs on continuous build machine during unit test. Unit test is parsing XML and custom ContentHandler is saving data to a HashMap.

/* HashMap for saving parsed data */
private static final ThreadLocal contextMap = new ThreadLocal() {
protected Object initialValue() {
return new HashMap();
}
};

/* Insertion of data into HashMap */
Map map = (Map) contextMap.get();
map.put(key, value);

Problem has not occurred on development machine with limited testing, but consistently fails on build machine.

ERROR MESSAGES/STACK TRACES THAT OCCUR :
Caused by: java.lang.NullPointerException
at java.util.HashMap$TreeNode.putTreeVal(HashMap.java:1970)
at java.util.HashMap.putVal(HashMap.java:637)
at java.util.HashMap.put(HashMap.java:611)

REPRODUCIBILITY :
This bug can be reproduced often.

CUSTOMER SUBMITTED WORKAROUND :
Check if key or value is not null, then insert into map.