Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.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 初始化空值项时出现空指针异常_Java_Nullpointerexception_Null - Fatal编程技术网

Java 初始化空值项时出现空指针异常

Java 初始化空值项时出现空指针异常,java,nullpointerexception,null,Java,Nullpointerexception,Null,我想给一个名为State的类的每个子项赋值,当我有一个状态数组时,最初所有的状态都为null,我在这里接收null指针引用: //finding all the neighbor states of a given configuration public State[] neighborStates(String config, int modeFlag){ State[] neighborStates=new State[7]; int i=0; for (Oper

我想给一个名为State的类的每个子项赋值,当我有一个状态数组时,最初所有的状态都为null,我在这里接收null指针引用:

//finding all the neighbor states of a given configuration

public State[] neighborStates(String config, int modeFlag){
    State[] neighborStates=new State[7];
    int i=0;
    for (Operation o : Operation.values()){
        neighborStates[i].config=move(config,o.name().charAt(0));
        neighborStates[i].realCost++;
        neighborStates[i].opSequence+=o.name();
        neighborStates[i].heuristicCost=getHeuristicCost(neighborStates[i].config, modeFlag);
        i++;
    }       

    return neighborStates;
}
我将代码更改为此,但我仍然得到NPE:

public State[] neighborStates(String config, int modeFlag){
        State[] neighborStates=new State[8];
        int i=0;
        for (Operation o : Operation.values()){
            neighborStates[i] = new State(move(config,o.name().charAt(0)),neighborStates[i].realCost++,
                                getHeuristicCost(neighborStates[i].config, modeFlag), neighborStates[i].opSequence+=o.name());
            //neighborStates[i].config=move(config,o.name().charAt(0));
            //neighborStates[i].realCost++;
            //neighborStates[i].opSequence+=o.name();
            //neighborStates[i].heuristicCost=getHeuristicCost(neighborStates[i].config, modeFlag);
            i++;
        }
类状态定义为:

public class State {
    public State(String config, int realCost, int heuristicCost, String opSequence){
        this.config = config;
        this.realCost = realCost;
        this.heuristicCost = heuristicCost;
        this.opSequence = opSequence;
    }

您需要在
邻域状态
数组中实例化
状态
。您已经创建了一个包含7个插槽的数组,但它们最初都是
null
。假设您有一个默认构造函数,它应该看起来像

for (Operation o : Operation.values()){
  neighborStates[i] = new State();
  // ...
另外,根据
Operation.values()


您需要在
邻域状态
数组中实例化
状态
。您已经创建了一个包含7个插槽的数组,但它们最初都是
null
。假设您有一个默认构造函数,它应该看起来像

for (Operation o : Operation.values()){
  neighborStates[i] = new State();
  // ...
另外,根据
Operation.values()


当您创建指定大小的数组时
State[]neightorstates=新状态[7]
您可以分配该内存。数组的每个索引都用类型的默认值初始化。布尔值的默认值为
false
。数字的默认值为
0
。重要的是:引用的默认值是
null


数组中的所有值都将为null,直到您使用
nextorstate[i]=newstate()实例化它们为止

当您使用创建指定大小的数组时
State[]neightorstates=新状态[7]
您可以分配该内存。数组的每个索引都用类型的默认值初始化。布尔值的默认值为
false
。数字的默认值为
0
。重要的是:引用的默认值是
null


数组中的所有值都将为null,直到您使用
nextorstate[i]=newstate()实例化它们为止

当您编写这行代码时 状态[]邻居状态=新状态[7]
您只接收到一个数组对象的引用,其中的所有7项都为null,此行仅初始化状态数组对象,其中没有任何项

因此,在for循环中,all项仍然为null,在使用它之前,必须先初始化每个项。
邻居状态[i]=新状态()

当您编写这行代码时 状态[]邻居状态=新状态[7]
您只接收到一个数组对象的引用,其中的所有7项都为null,此行仅初始化状态数组对象,其中没有任何项

因此,在for循环中,all项仍然为null,在使用它之前,必须先初始化每个项。
邻居状态[i]=新状态()

您只初始化了一个数组,但尚未在状态[]数组中构造成员。
在使用状态类之前,需要调用构造函数来构造它。 尝试按以下方式更改代码:

public State[] neighborStates(String config, int modeFlag){
    State[] neighborStates=new State[7];
    int i=0;
    for (Operation o : Operation.values()){
        neighborStates[i] = new State(move(config,o.name().charAt(0)),
                                      someRealCost, //what's the value of this parameter?
                                      getHeuristicCost(config, modeFlag),
                                      modeFlag
                                      );
        ....
        i++;
    }
}

您仅初始化数组,但尚未在状态[]数组中构造成员。
在使用状态类之前,需要调用构造函数来构造它。 尝试按以下方式更改代码:

public State[] neighborStates(String config, int modeFlag){
    State[] neighborStates=new State[7];
    int i=0;
    for (Operation o : Operation.values()){
        neighborStates[i] = new State(move(config,o.name().charAt(0)),
                                      someRealCost, //what's the value of this parameter?
                                      getHeuristicCost(config, modeFlag),
                                      modeFlag
                                      );
        ....
        i++;
    }
}

更新后的问题版本

您正在计算此表达式-

new State(move(config,o.name().charAt(0)),neighborStates[i].realCost++,
                            getHeuristicCost(neighborStates[i].config, modeFlag), neighborStates[i].opSequence+=o.name());    

在为
邻居状态[i]
赋值之前。所以说,
nextorstates[i].realCost++
触发空指针异常的部分-
nextorstates[i]
对于更新后的问题版本,仍然是
null

您正在计算此表达式-

new State(move(config,o.name().charAt(0)),neighborStates[i].realCost++,
                            getHeuristicCost(neighborStates[i].config, modeFlag), neighborStates[i].opSequence+=o.name());    

在为
邻居状态[i]
赋值之前。所以说,
neighterstates[i].realCost++
触发了空指针异常-
neighterstates[i]
仍然是
null

嗨,Elliot,我更新了你说的代码,但是我还没有得到NPE,你能看一下吗?我不是这么说的,你的
状态
从非构造函数变成了获取一切?因为State.java中的构造函数就像
公共状态(String config,int realCost,int heuristicCost,String opSequence)
getHeuristicCost
在初始化
邻居状态[i]
时仍然使用
邻居状态[i]
。在这一点上,它仍然是空的@MonaJalal如果您还没有为类创建getter/setter方法,我建议您为类创建getter/setter方法,这样您就可以使用
nextorstates[I]=newstate()
,创建方法,例如
setConfig(String-config){this.config=config;
,然后使用
邻域状态[i].getConfig()检索必要的信息
或类似的东西。嗨,Elliot,我更新了你所说的代码,但我还没有得到NPE,你能看一下吗?这不是我说的,你的
状态从非构造函数变为获取一切吗?因为State.java中的构造函数类似于
公共状态(String config,int realCost,int heuristicCost,String opSequence)
getHeuristicCost
仍在使用
neighborStates[i]
初始化
neighborStates[i]
。在这一点上,它仍然是空的!@MonaJalal我建议为您的类创建getter/setter方法,如果您还没有这样做的话-这样您就可以使用
neigherstates[I]=new State();
,创建方法,例如
setConfig(String config){this.config=config;
,然后使用
邻居状态[i].getConfig()
或类似的方法检索必要的信息。State.java中没有State这样的构造函数,我不应该更改类State.java!问题中提到的State的唯一构造函数你是对的,它应该