无法解决这个问题,我创建了一个简单的坐标类来保存x和y整数。在另一个类中,我有一个名为“ords”的全局坐标数组。在我的循环中,我正在添加坐标。当我尝试在我的getaction方法中使用Coordinates类中的方法getX()和getY()时,我得到一个空指针异常。我确定对象不是空的,但我仍然无法弄清楚什么是错的。任何帮助表示赞赏。
import java.util.*;
import org.w2mind.net.*;
import java.io.Serializable;
public class ConorsMind implements Mind
{
int [][] surroundings = new int [12][16];
Coordinates [] ords = new Coordinates [192];
int currentX;
int currentY;
//====== Mind must respond to these methods: ==========================================================
// newrun(), endrun()
// getaction()
//======================================================================================================
public void newrun() throws RunError
{
}
public void endrun() throws RunError
{
}
private void formTwoDimmensional(int [] someArray)
{
int counter = 0;
int n=0;
for(int i = 0; i < 15; i++)
{
for(int z = 0; z < 12; z++)
{
surroundings[z][i] = someArray[counter];
if(surroundings[z][i] ==0) {
currentX=z;
currentY=i;
}
else if(surroundings[z][i]==4){
ords[n]= new Coordinates(z,i);
n++;
}
System.out.print(z+" , "+i+": "+surroundings[z][i]);
System.out.println();
counter++;
}
}
}
public Action getaction ( State state )
{
String s = state.toString();
String[] x = s.split(",");
int act =MinerWorldUpdated.NO_ACTIONS;
int counter = 0;
int [] surround = new int [192];
//in this way user will have ability to see what surrounds him
for(int i = 11; i < 203; i++)
{
surround[counter] = Integer.parseInt(x[i]);
counter++;
}
formTwoDimmensional(surround);
int [] response = new int [x.length];
for(int i = 0; i < x.length; i++)
{
response[i] = Integer.parseInt ( x[i] );
}
System.out.println("Current position: "+currentX+" ,"+currentY);
int coalX=ords[0].getX();
int coalY=ords[0].getY();
System.out.println("Coal position: "+coalX+" ,"+coalY);
if(coalX != 0 && coalY !=0)
{
if(coalX>currentX)
{
act=MinerWorldUpdated.ACTION_DOWN;
}
else if(coalY<currentY)
{
act=MinerWorldUpdated.ACTION_LEFT;
}
else if(coalX<currentX)
{
act=MinerWorldUpdated.ACTION_DOWN;
}
else if(coalY<currentY)
{
act=MinerWorldUpdated.ACTION_LEFT;
}
}
String a = String.format ( "%d", act );
return new Action ( a );
}
}
class Coordinates implements Serializable
{
private int x;
private int y;
public Coordinates(int x1, int y1)
{
x=x1;
y=y1;
}
public int getX(){
return x;
}
public int getY(){
return y;
}
}
错误如下: 显示java.lang.NullPointerException 在ConorsMind.getaction(ConorsMind.java:146)
错误源于以下两行:
int coalX=ords[0].getX();
int coalY=ords[0].getY();
我正在调用formTwoDimensional()并且它正常工作,ords对象正在成功创建并且不为null,因为使用System.out.println(ords [n] .getX())进行测试时会在放置时打印预期结果在我的其他地方如果(环境[z] [i] == 4)阻止。
答案 0 :(得分:2)
您需要确保调用formTwoDimensional()。如果你确实如此,那么你很可能在嵌套的for循环中没有进入你的else,因此ords [0]实际上从未被设置,所以当你尝试访问它时,它是null。 / p>
另一件事,如果你不想发布其余的代码,就是添加一些调试代码。请参见下面的布尔值zero_pos_set。但请确保在程序崩溃之前看到打印“Zero pos set”。我的赌注是你没有。
public class ConorsMind implements Mind
{
int [][] surroundings = new int [12][16];
Coordinates [] ords = new Coordinates [192];
boolean zero_pos_set = false;
private void formTwoDimmensional(int [] someArray)
{
int counter = 0;
int n=0;
for(int i = 0; i < 15; i++) {
for(int z = 0; z < 12; z++) {
surroundings[z][i] = someArray[counter];
if(surroundings[z][i] ==0) {
currentX=z;
currentY=i;
} else if(surroundings[z][i]==4) {
zero_pos_set = true;
ords[n]= new Coordinates(z,i);
n++;
}
counter++;
}
}
}
public Action getaction ( State state ) {
if(zero_pos_set) {
System.out.println("Zero pos set!");
}
int coalX=ords[0].getX();
int coalY=ords[0].getY();
System.out.println("Coal position: "+coalX+" ,"+coalY);
return new Action ( a );
}
}
答案 1 :(得分:1)
基于此线程中发布的所有调试信息,似乎在你的getaction()函数中,你正在传递一些不包含4的状态。
当您解析此信息并将其传递给formTwoDimensional()时,您将永远不会到达else if块,因此永远不会设置ords [0]或任何其他ords [n]。
因此,当你尝试在getaction()函数中访问ords [0]时,实际上你得到null,因此你的NullReferenceException。
答案 2 :(得分:0)
这是一个操作顺序问题。
如果您从未拨打formTwoDimmensional()
,则永远不会初始化阵列内的任何内容。确保你先打电话。
当您尝试拨打coalX=ords[0].getX();
时会发生实际的NPE,如果ords[0]
为null
,则无效。