我是Java的新手(来自其他语言的C#),如果我创建一个变量并在类的空白空间中实例化它,就像这样;
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
}
}
以与上述情况相同的方式,它在方法中实例化而不是类时工作正常。以下工作符合预期;
public class LevelClass extends SomeOtherClass{
private Map<String, LevelItemKeyClass> levelItemKeys;
private void CreateKeys() {
levelItemKeys = new HashMap<String, LevelItemKeyClass>();
levelItemKeys.put(new LevelItemKeyClass("abc"));
}
}
答案 0 :(得分:3)
您正在实例化容量为SomeClass
的{{1}}的双维数组。
这绝不会抛出5 * 5
,除非<{strong} NullPointerException
中的某个静态初始化程序抛出它(实际上它会抛出SomeClass
)。
可能,您正在尝试访问任何数组元素,默认情况下初始化为ExceptionInInitializerError
(非初始化null
都具有Object
默认值),然后调用实例方法,这将抛出null
。
简而言之,在NullPointerException
上调用任何方法之前,您需要初始化该元素,例如:
someClassArray[x][y]
修改强>
因为你的问题发生了很大变化......
如果您在此声明中遇到someClassArray[x][y] = new SomeClass();
:
NullPointerException
...并且您的levelItemKeys.put(new LevelItemKeyClass('abc')); // NullPointerException occurs here
映射在修改之前已初始化,这意味着NPE已在您的构造函数中抛出。您还没有发布代码。
我建议使用调试器。
答案 1 :(得分:0)
在我看来,问题在于实例变量初始化的顺序与JAVA和C#之间的构造函数相比有所不同。