It looks like it’s not that null
is treated as a NullPointerException
, but that the act of attempting to throw null
itself throws a NullPointerException
.
In other words, throw
checks that its argument is nonnull, and if it is null, it throws a NullPointerException
.
JLS 14.18 specifies this behavior:
If evaluation of the Expression completes normally, producing a null value, then an instance V’ of class NullPointerException is created and thrown instead of null. The throw statement then completes abruptly, the reason being a throw with value V’.