2016-02-12 16 views
0

我是新來的Java(來自C#之間的其他語言),如果我創建一個變量並在類的空白空間中實例化它;Java實例化類空間中的類的數組產生空指針異常

private SomeClass[][] someClassArray = new SomeClass[5][5]; 

然後,我收到一個NullPointerException。但是,如果我不在那裏實例化,而是在一個方法中工作正常。看起來有些時候我可以逃避這一點。

我試着在文檔中查找,但沒有任何運氣。有人可以提供一些反饋或鏈接來解釋這個,所以我明白如何在Java中正確實例化?

編輯:

在這種情況下它是在一個if語句中使用someClassArray.length時error'ing。爲什麼當在一個方法中實例化而不是在類中時,它會正確地工作。

以下是另一個例子,其中我分配值時得到的NullPointerException ...

public class LevelClass extends SomeOtherClass{ 

    private Map<String, LevelItemKeyClass> levelItemKeys = new HashMap<String, LevelItemKeyClass>(); 

    private void CreateKeys() { 
     levelItemKeys.put(new LevelItemKeyClass("abc")); //NullPointerException occurs here 
    } 
} 

以相同的方式如上面的情況下,它工作正常的方法中的實例化,但是不是類時。以下工作如預期;

public class LevelClass extends SomeOtherClass{ 

    private Map<String, LevelItemKeyClass> levelItemKeys; 

    private void CreateKeys() { 
     levelItemKeys = new HashMap<String, LevelItemKeyClass>(); 

     levelItemKeys.put(new LevelItemKeyClass("abc")); 
    } 
} 
+0

'private SomeClass [] [] someClassArray = new SomeClass [5] [5]();'? –

+0

初始化它應該可以正常工作。您需要向任何人展示更多代碼以幫助查找問題。 – resueman

+0

什麼是「一堂課的空白空間」? – Berger

回答

0

在我看來,問題在於實例變量初始化的次序與JAVA和C#之間的構造函數相比的差異。

3

您實例的SomeClass雙維陣列容量5 * 5

這不會拋出NullPointerException除非SomeClass一些靜態初始化拋出它(這實際上會拋出一個ExceptionInInitializerError反正)。 有可能的,你再試圖訪問任何數組元素,這是默認初始化爲null(未初始化Object一切都具有null默認值),然後調用一個實例方法,它會拋出NullPointerException

總之,在調用任何someClassArray[x][y]方法之前,你需要初始化元素,如:

someClassArray[x][y] = new SomeClass(); 

編輯

由於您的問題已經有了很大的變化...... 如果您在本聲明中遇到NullPointerException

levelItemKeys.put(new LevelItemKeyClass('abc')); // NullPointerException occurs here 

...和你的levelItemKeys映射在修改之前被初始化,這意味着NPE已經在你的構造函數中拋出。你還沒有發佈代碼。

我建議使用調試器。

+0

感謝@梅納,但我不確定在這裏是這種情況。請參閱我的編輯。 – vdidxho