Returning null as an int permitted with ternary operator but not if statement
The compiler interprets null
as a null reference to an Integer
, applies the autoboxing/unboxing rules for the conditional operator (as described in the Java Language Specification, 15.25), and moves happily on. This will generate a NullPointerException
at run time, which you can confirm by trying it.
In the case of the if
statement, the null
reference is not treated as an Integer
reference because it is not participating in an expression that forces it to be interpreted as such. Therefore the error can be readily caught at compile-time because it is more clearly a type error.
As for the conditional operator, the Java Language Specification §15.25 “Conditional Operator ? :
” answers this nicely in the rules for how type conversion is applied:
- If the second and third operands have the same type (which may be the null type), then that is the type of the conditional expression.
Does not apply becausenull
is notint
.
- If one of the second and third operands is of type boolean and the type of the other is of type Boolean, then the type of the conditional expression is boolean.
Does not apply because neithernull
norint
isboolean
orBoolean
.
- If one of the second and third operands is of the null type and the type of the other is a reference type, then the type of the conditional expression is that reference type.
Does not apply becausenull
is of the null type, butint
is not a reference type.
- Otherwise, if the second and third operands have types that are convertible (§5.1.8) to numeric types, then there are several cases: […]
Applies:null
is treated as convertible to a numeric type, and is defined in §5.1.8 “Unboxing Conversion” to throw aNullPointerException
.
I think, the Java compiler interprets true ? null : 0
as an Integer
expression, which can be implicitly converted to int
, possibly giving NullPointerException
.
For the second case, the expression null
is of the special null type see, so the code return null
makes type mismatch.
Actually, its all explained in the Java Language Specification.
The type of a conditional expression is determined as follows:
- If the second and third operands have the same type (which may be the null type), then that is the type of the conditional expression.
Therefore the "null" in your (true ? null : 0)
gets an int type and then is autoboxed to Integer.
Try something like this to verify this (true ? null : null)
and you will get the compiler error.