class ThrowNull {
public static void main(String[] args) {
throw null;
}
}
We know that rule for throw is throw ThrowableInst
I think because Null can be cast in to any type of reference.so in compile time its nothing wrong if you are throwing null instead of throwable.
According to the language specification, a throw
statement is defined as:
throw Expression
And if the Expression
evaluates to null
, then a NullPointerException
is thrown. Specifically,
If evaluation of the Expression completes normally, producing a
null
value, then an instance V' of classNullPointerException
is created and thrown instead ofnull
.
Since NullPointerException
extends RuntimeException
, it is an unchecked exception. This could explain why there's no compile-time error reported from this construct.
There are many things a compiler doesn't check, it assumes you do things for a good reason which it might not know about. What it does try to prevent is the common mistakes developers make.
It is possible some one thinks this is a good short hand for
throw new NullPointerException();
Integer i = null;
try {
i.intValue();
} catch (NullPointerException npe) {
System.err.println("Caught NPE");
npe.printStackTrace();
}
and
try {
throw null;
} catch (NullPointerException npe) {
System.err.println("Caught NPE");
npe.printStackTrace();
}
prints in Java 6 update 38
Caught NPE
java.lang.NullPointerException
at Main.main(Main.java:9)
In generel, and not just throw. Any object variable can be assigned null. So we can see that throw is not a special case. Should it be? maybe. Is it consistent? Yes.