Alejandro Garcia
Alejandro Garcia

Reputation: 317

java.lang.NullPointerException with boolean

I wrote a realy simple code based on another question and here it is:

It throws me an error

java.lang.NullPointerException line 5 and 17

I don't know what I'm doing wrong.

 public class Main {

    public static String bool(Boolean param){
        if(param == true){    (line 5)
            return "a";
        }else if(param == false){
            return "b";
        }
        return "c";

    }

    public static void main(String[] args){

        System.out.println(bool(true));
        System.out.println(bool(null)); (line 17)
        System.out.println(bool(false));


    }
}

Upvotes: 16

Views: 28540

Answers (5)

Nikunj Trivedi
Nikunj Trivedi

Reputation: 91

Clearly, as mentioned by others if param is null, the below throws NullPointerException.

param == true

According to the Java language specification, unboxing happens via calling Boolean.booleanValue(), Number.longValue(), Number.intValue() etc. Its like calling those methods manually and NullPointerException is the result of unboxing a null.

We can also detect these Unboxing vulnerabilities, if not handled properly using static code analysis tools. Kindly refer this for more information Boolean Violation

Upvotes: 0

Mureinik
Mureinik

Reputation: 311188

Your code compares a java.lang.Boolean instance with a primitive boolean, which means unboxing the java.lang.Boolean. Since null can't be unboxed, a NullPointerException is thrown.

You could work around this by using the built in constants Boolean.TRUE and Boolean.FALSE:

public static String bool(Boolean param) {
    if (Boolean.TRUE.equals(param)) {
        return "a";
    } else if (Boolean.FALSE.equals(param)) {
        return "b";
    }
    return "c";
}

Upvotes: 1

Govind
Govind

Reputation: 311

So your program must be something like this.

public class BooleanBug {

    public static String bool(Boolean param) {
        if ((null != param) && param.booleanValue() == true) {
            return "a";
        } else if ((null != param) && param.booleanValue() == false) {
            return "b";
        }
        return "c";

    }

    public static void main(String[] args) {

        System.out.println(bool(true));
        System.out.println(bool(null));
        System.out.println(bool(false));

    }
}

Upvotes: 0

Marko Topolnik
Marko Topolnik

Reputation: 200148

null cannot be auto-unboxed to a primitive boolean value, which is what happens when you try to compare it with true. In

param == true

The type of true is boolean, therefore the left-hand operand must also be a boolean. You are passing in a Boolean, which is an object, but can be auto-unboxed to boolean.

Therefore this is equivalent to

param.booleanValue() == true

Clearly, if param is null, the above throws NullPointerException.

To avoid the hidden pitfalls of auto-unboxing, you could instead work with the Boolean objects:

if (Boolean.TRUE.equals(param))
  return "a";
if (Boolean.FALSE.equals(param))
  return "b";
return "c";

Upvotes: 46

Alex
Alex

Reputation: 3181

You used the Boolean instead of boolean. Boolean is a class, which means you can assign objects to it. In your case, you passed in a null, which is then assigned to param. You then tried to use param, which of course resulted in a NullPointerException.

You can:

  • Get rid of the line bool(null)
  • Change Boolean to boolean in the parameters for bool()
  • Add an else if for when param is null

Upvotes: 0

Related Questions