Null Returns in Ternary Operators vs. If Statements
Consider the following Java code snippet:
<code class="java">public class Main { private int temp() { return true ? null : 0; } private int same() { if (true) { return null; } else { return 0; } } public static void main(String[] args) { Main m = new Main(); System.out.println(m.temp()); System.out.println(m.same()); } }</code>
In the temp() method, the ternary operator true ? null : 0 checks if true is true and returns null, otherwise it returns 0. Despite the return type of the method being an int, the compiler allows null to be returned. However, when running the code, a NullPointerException is thrown.
In the same() method, the if statement attempts to return null if true is true, but the compiler reports a compile-time error due to incompatible return types.
Why the Difference?
The key difference is how the compiler interprets null in the ternary operator and the if statement. In the ternary operator, null is treated as a null reference to an Integer object. Under the autoboxing and unboxing rules (Java Language Specification, 15.25), the null is automatically converted to an int by unboxing, resulting in a NullPointerException when the int is used.
In contrast, the if statement explicitly checks the truthiness of the expression true and attempts to return null, which is incompatible with the declared return type of an int. Hence, the compiler generates a compile-time error to prevent incorrect code execution.
The above is the detailed content of Why Does a Null Return Cause a NullPointerException in a Ternary Operator but a Compile-Time Error in an If Statement?. For more information, please follow other related articles on the PHP Chinese website!