从另一个java类访问int[]时出现问题
我尝试运行以下代码,但由于某些原因,在从class从另一个java类访问int[]时出现问题,java,arrays,nullpointerexception,int,Java,Arrays,Nullpointerexception,Int,我尝试运行以下代码,但由于某些原因,在从classIntelligentPlayer 公共类IntelligentPlayer扩展了RealPlayer{ private int[][]wing=新int[][{{0,1,2},{3,4,5},{6,7,8},{0,3,6},{1,4,7},{2,5,8},{0,4,8},{2,4,6}; 保护地; 自我保护; 公共整数移动(整数移动){ for(int[]可能性:获胜){ 返回字段计数(可能性,3)[1]; } } 私有int[]字段计数(i
IntelligentPlayer
公共类IntelligentPlayer扩展了RealPlayer{
private int[][]wing=新int[][{{0,1,2},{3,4,5},{6,7,8},{0,3,6},{1,4,7},{2,5,8},{0,4,8},{2,4,6};
保护地;
自我保护;
公共整数移动(整数移动){
for(int[]可能性:获胜){
返回字段计数(可能性,3)[1];
}
}
私有int[]字段计数(int[]测试,int len){
System.out.println(“+test[0]+test[1]+test[2]);
System.out.println(field.playField[2]);
int[]temp=newint[]{0,0,0};
对于(int i=0;i
公共类字段{
int[][]wing=新int[][{{0,1,2},{3,4,5},{6,7,8},{0,3,6},{1,4,7},{2,5,8},{0,4,8},{2,4,6};
公共int[]playField=新int[9];
受保护字符[]符号=新字符[]{O','',X'};
私人内翻;
私人RealPlayer播放器1;
私人RealPlayer播放器2;
公共场地(RealPlayer pl1、RealPlayer pl2){
this.player1=pl1;
this.player2=pl2;
this.player1.field=this;
this.player2.field=this;
this.player1.self=-1;
this.player2.self=1;
this.playField=newint[]{0,0,0,0,0,0,0};
}
}
编辑:
测试代码为:
字段f=新字段(新RealPlayer(),新IntelligentPlayer(),-1);
f、 移动(2);
System.out.println(f.toString());
f、 移动(2);
System.out.println(f.toString());
f、 移动(0);
我希望fieldCount
返回一个int数组,但得到了以下结果:
java.lang.NullPointerException
at TicTacToe.IntelligentPlayer.fieldCount(IntelligentPlayer.java:60)
at TicTacToe.IntelligentPlayer.move(IntelligentPlayer.java:24)
at TicTacToe.Field.move(Field.java:50)
删除
受保护字段代码>来自智能播放器
类。这将允许类访问父类中定义的字段
字段(这是字段
构造函数正在设置的)
更好的是,在RealPlayer
中定义一个setter,并使用该setter而不是直接分配变量:
public void设置字段(字段){
this.field=字段;
}
删除受保护字段代码>来自智能播放器
类。这将允许类访问父类中定义的字段
字段(这是字段
构造函数正在设置的)
更好的是,在RealPlayer
中定义一个setter,并使用该setter而不是直接分配变量:
public void设置字段(字段){
this.field=字段;
}
字段
为空。另外,move(int)
函数中的循环不会使senseIntelligentPlayer生效。使用新的IntelligentPlayer或RealPlayer初始化字段后,字段不为空。我们可以看到您在哪里初始化它吗?编辑:OP edited code init位于第2行的测试代码中:RealPlayer a=newrealplayer();字段f=新字段(新RealPlayer(),新IntelligentPlayer());哦,我明白了<代码>字段
为空,因为子类不重写其父类的字段。您正在将两个类型为RealPlayer
的对象传递给Field
,Field
为空。另外,move(int)
函数中的循环不会使senseIntelligentPlayer生效。使用新的IntelligentPlayer或RealPlayer初始化字段后,字段不为空。我们可以看到您在哪里初始化它吗?编辑:OP edited code init位于第2行的测试代码中:RealPlayer a=newrealplayer();字段f=新字段(新RealPlayer(),新IntelligentPlayer());哦,我明白了<代码>字段
为空,因为子类不重写其父类的字段。您正在将两个类型为RealPlayer
的对象传递到Field
。这意味着我的问题是覆盖受保护的字段;在智能播放器中?或多或少。它比这要复杂一点(你在隐藏它,而不是覆盖它),但这就是它的要点。这意味着我的问题是覆盖受保护的字段;在智能播放器中?或多或少。它比这要复杂一点(你要隐藏它,而不是覆盖它),但这就是它的要点。
public Field(RealPlayer pl1, RealPlayer pl2) {
this.player1 = pl1;
this.player2 = pl2;
this.player1.setField(this);
this.player2.setField(this);
this.player1.self = -1;
this.player2.self = 1;
this.playField = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 0};
}