Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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类访问int[]时出现问题_Java_Arrays_Nullpointerexception_Int - Fatal编程技术网

从另一个java类访问int[]时出现问题

从另一个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

我尝试运行以下代码,但由于某些原因,在从class
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};
    }