This week, I’ve lived again an experience from a few years ago, but in the opposite seat.
As a software architect/team leader/technical lead (select the term you’re more comfortable with), I was doing code reviews on an project we were working on and I stumbled upon a code that looked like that:
public void someMethod(Type parameter) {
if (parameter == null) {
throw new NullPointerException("Parameter Type cannot be null");
}
// Rest of the method
}
I was horribly shocked!
An applicative code throwing a NullPointerException
, that was a big coding mistake.
So I gently pointed to the developer that it was a bad idea and that I’d like him to throw an IllegalArgumentException
instead, which exactly the exception type matching the use-case.
This was very clear in my head, until the dev pointed me the NullPointerException
Javadoc.
For simplicity’s sake, here’s the juicy part:
Thrown when an application attempts to use
null
in a case where an object is required. These include:
- Calling the instance method of a
null
object.- Accessing or modifying the field of a
null
object.- Taking the length of
null
as if it were an array.- Accessing or modifying the slots of
null
as if it were an array.- Throwing
null
as if it were aThrowable
value.Applications should throw instances of this class to indicate other illegal uses of the
null
object.
Read the last sentence again:
"Applications should throw instances of this class to indicate other illegal uses of the null
object".
It seems to be legal for an application to throw an NPE, even recommended by the Javadocs.
In my previous case, I read it again and again… And ruled that yeah, it was OK for an application to throw an NPE. Back to today: a dev reviewed the pull request from another one, found out it threw an NPE and ruled it was bad practice. I took the side of the former dev and said it was OK.
What would be your ruling and more importantly, why?
Note: whatever the decision, this is not a big deal and probably not worth the time you spend bickering about it 😉