Java 初始化空值项时出现空指针异常
我想给一个名为State的类的每个子项赋值,当我有一个状态数组时,最初所有的状态都为null,我在这里接收null指针引用: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
//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的唯一构造函数你是对的,它应该