2012-04-05 110 views
7

這是在Java中,跨平臺並在運行Ubuntu Oneric的計算機上調試,OpenJDK作爲運行時安裝。Java - EnumSet.add(枚舉),拋出NullPointerException

我有一個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枚舉類型的主體中,我有

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

因爲,毫不誇張地說,整個枚舉保存包聲明。 this.passability聲明

private EnumSet <Passability> passability; 

在類定義的開始,我的印象是,在add()方法被繼承的Java標準的EnumSet定義的一部分之下。

我是自學的,但我並不瘋狂。要麼我錯了,要麼有更好的方法來做到這一點。那裏有一些有用的知識能夠伸出援助之手嗎?

+0

可以顯示更多代碼塊嗎?所有我看到,如果一條線在這裏和那裏。 – Adrian 2012-04-05 16:13:24

+0

Jon Skeet擁有它。 我從來沒有初始化它,因爲我習慣於只使用基元〜我試着吻我的工作,因爲它保持了事物的完整。 – 2012-04-05 16:25:26

回答

16

所以你宣佈passability變量,但你已經證明未見其蹤影被分配比null默認值以外的值。也許你的意思是:

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

EnumSet是一個對象,像任何其他 - 所以,除非你明確地給你的變量,則其null默認值,當你調用它add,你會得到一個NullPointerException - 這正是發生在這裏的事情。

+0

是的,先生,這工作得很好。但是,我對這個說明有些擔心。現在,這被添加到字段聲明中〜它是否真的很安全,還是應該將它移到我的構造函數調用中? 即, '私人EnumSet 通過性;' 了上述和 'this.passability = EnumSet.noneOf(Passability.class);在構造體' ? – 2012-04-05 16:28:46

+2

@ThatGuy:沒關係。他們幾乎相當。 – 2012-04-05 16:29:07