Java实例化类空间中类的数组会产生NullPointerException
我是Java新手(来自C#和其他语言),如果我创建一个变量并在类的空白处实例化它,就像这样Java实例化类空间中类的数组会产生NullPointerException,java,variables,nullpointerexception,instantiation,Java,Variables,Nullpointerexception,Instantiation,我是Java新手(来自C#和其他语言),如果我创建一个变量并在类的空白处实例化它,就像这样 private SomeClass[][] someClassArray = new SomeClass[5][5]; 然后我收到一个NullPointerException。然而,如果我不在那里实例化,而是在一个方法中实例化,它就可以正常工作。似乎其他时候我可以不受惩罚 我试着在文档中查找这个,但没有任何运气。有人能提供一些反馈或链接来解释这一点,以便我理解如何正确地用Java实例化吗 编辑: 在本例
private SomeClass[][] someClassArray = new SomeClass[5][5];
然后我收到一个NullPointerException。然而,如果我不在那里实例化,而是在一个方法中实例化,它就可以正常工作。似乎其他时候我可以不受惩罚
我试着在文档中查找这个,但没有任何运气。有人能提供一些反馈或链接来解释这一点,以便我理解如何正确地用Java实例化吗
编辑:
在本例中,在if语句中使用someClassArray.length
时出错。为什么在方法中实例化而不是在类中实例化时,这会正常工作
下面是另一个例子,在其中我在赋值时得到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
}
}
公共类LevelClass扩展了其他类{
私有映射levelItemKeys=newHashMap();
私有void CreateKeys(){
levelItemKeys.put(新的LevelItemKeyClass(“abc”);//此处发生NullPointerException
}
}
与上述情况相同,当在方法中而不是在类中实例化时,它可以正常工作。以下各项工作符合预期
public class LevelClass extends SomeOtherClass{
private Map<String, LevelItemKeyClass> levelItemKeys;
private void CreateKeys() {
levelItemKeys = new HashMap<String, LevelItemKeyClass>();
levelItemKeys.put(new LevelItemKeyClass("abc"));
}
}
公共类LevelClass扩展了其他类{
私有映射levelItemKey;
私有void CreateKeys(){
levelItemKeys=newHashMap();
levelItemKeys.put(新的LevelItemKeyClass(“abc”));
}
}
您正在实例化容量为5*5
的SomeClass
的二维数组
除非SomeClass
中的某个静态初始值设定项抛出它,否则它永远不会抛出NullPointerException
(这实际上会抛出异常InInitializerRor
)。
很可能,您正在尝试访问任何数组元素,该数组元素在默认情况下初始化为null
(未初始化的Object
s都具有null
默认值),然后调用一个实例方法,该方法将抛出NullPointerException
简而言之,在调用someClassArray[x][y]
上的任何方法之前,您需要初始化该元素,例如:
someClassArray[x][y] = new SomeClass();
编辑
因为你的问题已经改变了很多。。。
如果在此语句中遇到NullPointerException
:
levelItemKeys.put(new LevelItemKeyClass('abc')); // NullPointerException occurs here
。。。并且您的levelItemKeys
映射在修改之前已初始化,这意味着NPE已被抛出到您的构造函数中。你还没有发布代码
我建议使用调试器 您正在实例化容量为
5*5
的SomeClass
的二维数组
除非SomeClass
中的某个静态初始值设定项抛出它,否则它永远不会抛出NullPointerException
(这实际上会抛出异常InInitializerRor
)。
很可能,您正在尝试访问任何数组元素,该数组元素在默认情况下初始化为null
(未初始化的Object
s都具有null
默认值),然后调用一个实例方法,该方法将抛出NullPointerException
简而言之,在调用someClassArray[x][y]
上的任何方法之前,您需要初始化该元素,例如:
someClassArray[x][y] = new SomeClass();
编辑
因为你的问题已经改变了很多。。。
如果在此语句中遇到NullPointerException
:
levelItemKeys.put(new LevelItemKeyClass('abc')); // NullPointerException occurs here
。。。并且您的levelItemKeys
映射在修改之前已初始化,这意味着NPE已被抛出到您的构造函数中。你还没有发布代码
我建议使用调试器 在我看来,问题在于实例变量的初始化顺序与JAVA和C#之间的构造函数的初始化顺序不同。在我看来,问题在于实例变量的初始化顺序与JAVA和C#之间的构造函数的初始化顺序不同。
私有SomeClass[]someClassArray=新的SomeClass[5][5]()代码>?以这种方式初始化应该可以正常工作。您需要向任何人显示更多代码以帮助查找问题。什么是“类的空白”?private SomeClass[][]someClassArray=new SomeClass[5][5]()代码>?以这种方式初始化应该可以正常工作。您需要向任何人显示更多代码来帮助查找问题。什么是“类的空白空间”?谢谢@Mena,但我不确定这里的情况是否如此。请看我的编辑。谢谢@Mena,但我不确定这里的情况是否如此。请看我的编辑。