Reputation: 5736
class ThrowNull {
public static void main(String[] args) {
throw null;
}
}
We know that rule for throw is throw ThrowableInstance;
, where ThrowableInstance
must be an object of type Throwable or a subclass of Throwable.
Simple types, such as int or char, as well as non-Throwable classes, such as String and Object, cannot be used as exceptions. null
is a special Java literal which represents a null value.
So why would throw null;
compile in this code?
Upvotes: 35
Views: 6995
Reputation: 5789
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.
Upvotes: 56
Reputation: 533670
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)
Upvotes: 5
Reputation: 4064
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.
Upvotes: 3
Reputation: 4517
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.
Upvotes: 2