Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java实例化类空间中类的数组会产生NullPointerException_Java_Variables_Nullpointerexception_Instantiation - Fatal编程技术网

Java实例化类空间中类的数组会产生NullPointerException

Java实例化类空间中类的数组会产生NullPointerException,java,variables,nullpointerexception,instantiation,Java,Variables,Nullpointerexception,Instantiation,我是Java新手(来自C#和其他语言),如果我创建一个变量并在类的空白处实例化它,就像这样 private SomeClass[][] someClassArray = new SomeClass[5][5]; 然后我收到一个NullPointerException。然而,如果我不在那里实例化,而是在一个方法中实例化,它就可以正常工作。似乎其他时候我可以不受惩罚 我试着在文档中查找这个,但没有任何运气。有人能提供一些反馈或链接来解释这一点,以便我理解如何正确地用Java实例化吗 编辑: 在本例

我是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
    }
}
公共类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,但我不确定这里的情况是否如此。请看我的编辑。