8

这是在 Java 中,跨平台并在运行 Ubuntu Oneric 的计算机上进行调试,并安装了 OpenJDK 作为我的运行时。

我有一个 EnumSet 用于在我正在开发的游戏中检查一个类的内部。我有这个来自 logcat 的读数,来自我的构造函数中的大量调试:

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)
    ...

不好玩。追踪它,我的问题似乎完全是这一行:

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

我的意思是那个函数的主体。它从构造函数调用为:

this.addPassability(Passability.AIR);

当 NullPointerException 发生时。在 Passability Enum Type 的正文中,我有

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

因为,从字面上看,整个枚举保存包声明。this.passability 被声明

private EnumSet <Passability> passability;

在类定义的开头,我的印象是 add() 方法是作为 Java 标准中 EnumSet 定义的一部分被继承的。

我是自学成才,但我并不疯狂。要么我有问题,要么有更好的方法来做到这一点。有一些有用的知识的人可以伸出援助之手吗?

4

1 回答 1

17

所以你已经声明了这个passability变量,但是你没有表现出任何迹象表明它被分配了一个默认值以外的值null。也许你的意思是:

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

AnEnumSet是一个对象,就像任何其他对象一样——所以除非你明确地给出你的变量,否则它将具有默认值,null当你调用add它时,你会得到一个NullPointerException——这正是这里发生的事情。

于 2012-04-05T16:10:06.187 回答