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’.