Is the null type a reference type?
Stephan Herrmann
stephan.herrmann at berlin.de
Tue Jan 28 16:58:11 UTC 2025
Am 28.01.25 um 17:40 schrieb David Alayachew:
> Isn't null a value and not a type?
null is a value, and null type is a type,
see https://docs.oracle.com/javase/specs/jls/se23/html/jls-4.html#jls-4.1
>
> On Tue, Jan 28, 2025, 9:25 AM Stephan Herrmann <stephan.herrmann at berlin.de
> <mailto:stephan.herrmann at berlin.de>> wrote:
>
> Assume this (nonsense) program, which is accepted by javac and ecj:
>
> public class X {
> public static void main(String[] args) {
> switch (null) {
> case null -> System.out.println("Null");
> default-> System.out.println("Default");
> }
> }
> }
>
> 14.1.1 Switch Blocks requires (T is the type of the selector expression):
> * If a null literal is associated with the switch block, then T is a
> reference type.
>
> In our case the selector expression has the null type, which can be assigned to
> any reference type, but it doesn't seem to be a reference type itself.
>
> From this I would conclude that the program is illegal.
>
>
> Next, lets remove the default case from the same program. Now compilers
> complain, here's how javac puts it:
>
> X.java:3: error: the switch statement does not cover all possible input values
> switch (null) {
> ^
> 1 error
>
> In previous discussions I learned that requiring a default label may be
> justified by requirements of future changes, but here for this reasoning to
> hold
> the null type would need to acquire new values, which seems very unlikely :).
> So, if the initial program would get the blessing from JLS, then also this case
> (without default) deserves a second look.
>
> thanks,
> Stephan
>
More information about the compiler-dev
mailing list