Java - EnumSet.add(enum), throws NullPointerException

That Guy picture That Guy · Apr 5, 2012 · Viewed 7.6k times · Source

This is in Java, cross platform and being debugged on a computer running Ubuntu Oneric with OpenJDK installed as my runtime.

I have an EnumSet for checking inside of in a class in a game I'm working on. I have this readout from logcat, from debug aplenty in my constructor:

Tile : passability being set...?
Exception in thread "Thread-1" javax.media.opengl.GLException:java.lang.NullPointerException
    ...
Caused by: java.lang.NullPointerException
    at net.darkglass.map.Tile.addPassability(Tile.java:144)
    ...

Not amusing. Tracking it down, my problem seems to be, entirely, this line:

public void addPassability(Passability type)
{
    this.passability.add(type);
}

By which I mean the body of that function. It is called from the constructor as:

this.addPassability(Passability.AIR);

When the NullPointerException happens. In the body of the Passability Enum Type, I have

public enum Passability
{
    AIR, ALL, GROUND, NONE, SIGHT, SKILL, STRUCTURE, WATER;
}

as, quite literally, the entire enum save package declaration. this.passability is declared

private EnumSet <Passability> passability;

at the beginning of the class definition and I was under the impression that the add() method was inherited as part of the definition of EnumSet in the Java Standard.

I'm self-taught, but I'm not crazy. Either I've got something wrong or there's a better way to do this. Anyone with some useful knowledge out there able to lend a hand?

Answer

Jon Skeet picture Jon Skeet · Apr 5, 2012

So you've declared the passability variable, but you've shown no sign of it being assigned a value other than the default value of null. Perhaps you meant:

private EnumSet<Passability> passability = EnumSet.noneOf(Passability.class);

An EnumSet is an object, like any other - so unless you explicitly give your variable, it will have the default value of null and when you call add on it, you'll get a NullPointerException - which is exactly what's happened here.