For example:
int anInt = null;
fails at compile time but
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println("" + getSomeVal());
}
}
public static int getSomeVal() {
return new Random().nextBoolean() ? 1 : null;
}
fails (usually) at run time. Trying to return just null will also result in a compile error, so I assume there is something about having multiple paths that causes the compiler to infer that null is potentially an autoboxed int? Why can javac not fail to compile both cases with the same error?
In the first case, the compiler knows that you’re trying to unbox a compile-time constant of
null.In the second case, the type of the conditional expression is
Integer, so you’re effectively writing:… so the unboxing isn’t happening on a constant expression, and the compiler will allow it.
If you changed it to force the conditional expression to be of type
intby unboxing there, it would fail: