Java 在 class space 中实例化 Class 的数组会产生 NullPointerException
Java Instantiating Array of Class in class space yields NullPointerException
我是 Java 的新手(来自 C# 和其他语言),如果我创建一个变量并在 class 的空 space 中实例化它,就像这样;
private SomeClass[][] someClassArray = new SomeClass[5][5];
然后我收到 NullPointerException。但是,如果我不在那里实例化而是在一种方法中实例化它就可以正常工作。好像其他时候我可以逃脱这个。
我试着在文档中查找,但没有成功。有人可以提供一些反馈或链接来解释这一点,以便我了解如何在 Java 中正确实例化吗?
编辑:
在这种情况下,在 if 语句中使用 someClassArray.length
时出错。为什么在方法中实例化时可以正常工作,但在 class.
中却不能?
下面是我在赋值时得到 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
}
}
以与上述情况相同的方式,它在方法中实例化时工作正常,但在 class 中不工作。以下按预期工作;
public class LevelClass extends SomeOtherClass{
private Map<String, LevelItemKeyClass> levelItemKeys;
private void CreateKeys() {
levelItemKeys = new HashMap<String, LevelItemKeyClass>();
levelItemKeys.put(new LevelItemKeyClass("abc"));
}
}
您正在实例化一个 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 已被抛出到您的构造函数中。您还没有发布代码。
我建议使用调试器。
在我看来,问题在于 JAVA 和 C# 之间的构造函数与实例变量的初始化顺序不同。
我是 Java 的新手(来自 C# 和其他语言),如果我创建一个变量并在 class 的空 space 中实例化它,就像这样;
private SomeClass[][] someClassArray = new SomeClass[5][5];
然后我收到 NullPointerException。但是,如果我不在那里实例化而是在一种方法中实例化它就可以正常工作。好像其他时候我可以逃脱这个。
我试着在文档中查找,但没有成功。有人可以提供一些反馈或链接来解释这一点,以便我了解如何在 Java 中正确实例化吗?
编辑:
在这种情况下,在 if 语句中使用 someClassArray.length
时出错。为什么在方法中实例化时可以正常工作,但在 class.
下面是我在赋值时得到 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
}
}
以与上述情况相同的方式,它在方法中实例化时工作正常,但在 class 中不工作。以下按预期工作;
public class LevelClass extends SomeOtherClass{
private Map<String, LevelItemKeyClass> levelItemKeys;
private void CreateKeys() {
levelItemKeys = new HashMap<String, LevelItemKeyClass>();
levelItemKeys.put(new LevelItemKeyClass("abc"));
}
}
您正在实例化一个 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 已被抛出到您的构造函数中。您还没有发布代码。
我建议使用调试器。
在我看来,问题在于 JAVA 和 C# 之间的构造函数与实例变量的初始化顺序不同。