Consider this class:
public class TestMap extends HashMap<String, Float> {
public static void main(String[] args) {
TestMap tm = new TestMap();
tm.put("A", 0F);
tm.put("B", null);
String[] keys = new String[]{"A", "B"};
for (String key : keys) {
System.out.println(key);
Float foo = (tm == null ? 0F : tm.get(key));
// Float foo = tm.get(key);
System.out.println(foo);
}
}
}
A NullPointerException is produced on the line Float foo =... during the second iteration of the loop:
A
0.0
B
Exception in thread "main" java.lang.NullPointerException
at TestMap.main(TestMap.java:14)
If I replace the existing line with the commented line immediately below it works as expected, assigning foo = null. Why is the behavior different in these two cases?
The value for key “B” is null. But the return type of your conditional expression is a float (primitive) due to you using the literal
0F, not a Float (wrapper), so the value has to be autounboxed (to a primitive) and then autoboxed (back to an object). This results in the NPE.Compare to what happens when you use
As an added explanation, here’s what your conditional is doing (showing explicit boxing):
JLS 15.25 defines what the return type of a conditional operator will be. It’s quite complex, and I find it easier to learn through experimentation :-).