Sometimes I come across Java code that unexpectedly throws NullPointerException in ternary operator. It is especially surprising if this particular line of code seems very simple like:
String value = null; Integer defaultValue = null; ... Integer result = (value != null ? Integer.parseInt(value) : defaultValue);
int value = -1; Integer defaultValue = null; ... Integer result = (value > 0 ? value : defaultValue);
At first, it might look like the condition is not met so defaultValue would be assigned to result.
In fact, the second argument of ternary operator is of type int and the third argument is of type Integer. The compiler than decides that the type of the whole expression will be plain int. and tries to unbox defaultValue which is actually null. This results in NullPointerException. The type of the variable result on the left side of the expression is ignored.
The decision that the type of the whole expression should be plain int instead of Integer conforms to JLS (Java Language Specification) and is explicitly based on tables in the specification.