This is one for the java purists I think. I recently had an issue with a method to perform a custom parsing of String values to a Boolean. A simple enough task, but for some reason the method below was throwing a NullPointerException in the null case...
static Boolean parseBoolean(String s)
{
return ("1".equals(s) ? true : ("0".equals(s) ? false : null));
}
The return type for the method is Boolean so why or how can a NullPointerException be thrown? From debugging through it seems the exception is being thrown at the point where the nested in-line conditional statement evaluates to null and returns null to the outer in-line conditional, but again I can't explain why.
Eventually I gave up and rewrote the method as follows, which works as expected:
static Boolean parseBoolean(String s)
{
if ("1".equals(s)) return true;
if ("0".equals(s)) return false;
return null;
}
The following code is half way between the two and also works as expected:
static Boolean parseBoolean(String s)
{
if ("1".equals(s)) return true;
return "0".equals(s) ? false : null;
}
Interesting but no answer tells you why this happens in the first place.
This has to do with the ternary expression.
The compiler interprets null as a null reference to Boolean, applies the autoboxing/unboxing rules for Boolean (on a null) => you get a NullPointerException at runtime.
My suggestion? Don't return
Boolean
, returnboolean
and throw an exception:Adopting an approach like the above will help avoid you accidentally referencing a null
Boolean
object.See the excellent answer from NilsH to see why your original method is throwing an exception.
This also works:
So the reason you get an NPE is due to autoboxing because using
boolean
in the ternary operator causes the result of the expression to be treated as aboolean
. And un-boxing ofnull
causes an NPE.