Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

IllegalArgumentException or NullPointerException for a null parameter? [closed]

I have a simple setter method for a property and null is not appropriate for this particular property. I have always been torn in this situation: should I throw an IllegalArgumentException, or a NullPointerException? From the javadocs, both seem appropriate. Is there some kind of an understood standard? Or is this just one of those things that you should do whatever you prefer and both are really correct?

like image 771
Mike Stone Avatar asked Aug 06 '08 19:08

Mike Stone


People also ask

How do you fix IllegalArgumentException?

Since IllegalArgumentException is an unchecked exception, you don't have to handle it in your code: Java will let you compile just fine. In many cases, instead of trying to catch IllegalArgumentException , you can simply check that a value falls in the expected range before passing it to a method.

When should I use IllegalArgumentException?

The IllegalArgumentException is very useful and can be used to avoid situations where the application's code would have to deal with unchecked input data. The main use of this IllegalArgumentException is for validating the inputs coming from other users.

What is the exception to throw if an argument is null?

The NullPointerException is an exception thrown by the Java Virtual Machine when you try to execute code on null reference (Like toString()). Show activity on this post. Throwing an exception that's exclusive to null arguments (whether NullPointerException or a custom type) makes automated null testing more reliable.

How do I avoid NullPointerException?

How to avoid the NullPointerException? To avoid the NullPointerException, we must ensure that all the objects are initialized properly, before you use them. When we declare a reference variable, we must verify that object is not null, before we request a method or a field from the objects.


2 Answers

You should be using IllegalArgumentException (IAE), not NullPointerException (NPE) for the following reasons:

First, the NPE JavaDoc explicitly lists the cases where NPE is appropriate. Notice that all of them are thrown by the runtime when null is used inappropriately. In contrast, the IAE JavaDoc couldn't be more clear: "Thrown to indicate that a method has been passed an illegal or inappropriate argument." Yup, that's you!

Second, when you see an NPE in a stack trace, what do you assume? Probably that someone dereferenced a null. When you see IAE, you assume the caller of the method at the top of the stack passed in an illegal value. Again, the latter assumption is true, the former is misleading.

Third, since IAE is clearly designed for validating parameters, you have to assume it as the default choice of exception, so why would you choose NPE instead? Certainly not for different behavior -- do you really expect calling code to catch NPE's separately from IAE and do something different as a result? Are you trying to communicate a more specific error message? But you can do that in the exception message text anyway, as you should for all other incorrect parameters.

Fourth, all other incorrect parameter data will be IAE, so why not be consistent? Why is it that an illegal null is so special that it deserves a separate exception from all other types of illegal arguments?

Finally, I accept the argument given by other answers that parts of the Java API use NPE in this manner. However, the Java API is inconsistent with everything from exception types to naming conventions, so I think just blindly copying (your favorite part of) the Java API isn't a good enough argument to trump these other considerations.

like image 81
Jason Cohen Avatar answered Oct 06 '22 08:10

Jason Cohen


It seems like an IllegalArgumentException is called for if you don't want null to be an allowed value, and the NullPointerException would be thrown if you were trying to use a variable that turns out to be null.

like image 20
Greg Hurlman Avatar answered Oct 06 '22 09:10

Greg Hurlman