所有
我正在尝试编写Connect4游戏。为此,我创建了一个P4Game类和一个P4Board类,它代表了Connect4板的i X j尺寸。
在P4Game中,我有以下内容:
public class P4Game{
//INSTANCE VARIABLES
private int nbLines;
private int nbColumns;
private P4Board [][] position;
//CONSTRUCTOR
public P4Game(int nbLines, int nbColumns){
this.nbColumns = nbColumns;
this.nbLines = nbLines;
P4Board [][] position = new P4Board [nbLines][nbColumns]; //Creates the table to receive the instances of the P4Board object.*/
for (int i=0; i<nbLines; i++){
for (int j=0; j<nbColumns; j++){
this.position[i][j] = new P4Board(i,j); //Meant to create each object at (line=i, column=j)
}
}
}
这会在我提到this.position[i][j]
的嵌套循环中导致NullPointerException。我在这个类的其他方法中引用这些对象,所以我需要它们作为实例变量。我想这个例外是因为我没有在表的开头列出表元素position[i][j]
作为实例变量。
我对这里的人的问题是(1)我的假设是正确的,如果是这样的话(2)声明这种形式的实例变量的语法是什么?
谢谢大家的帮助,我意识到这是一个非常基本的问题。希望它也会使其他新手受益。
干杯,
JDelage
答案 0 :(得分:3)
请参阅内联添加的评论...您的代码很好,除了一个小细节,您正在创建一个新的position
变量,您实际上意味着使用实例变量。
public class P4Game{
//INSTANCE VARIABLES
private int nbLines;
private int nbColumns;
private P4Board [][] position;
//CONSTRUCTOR
public P4Jeu(int nbLines, int nbColumns){
this.nbColumns = nbColumns;
this.nbLines = nbLines;
// You're creating a LOCAL variable called position here if you don't comment what's commented:.
/*P4Board [][] */position = new P4Board [nbLines][nbColumns]; //Creates the table to receive the instances of the P4Board object.*/
for (int i=0; i<nbLines; i++){
for (int j=0; j<nbColumns; j++){
this.position[i][j] = new P4Board(i,j); //Meant to create each object at (line=i, column=j)
}
}
}
}
答案 1 :(得分:2)
您的假设不正确。
在构造函数中,您将创建一个与该字段同名的局部变量。 (通过编写 P4Board [][]
position = ...
)这会创建一个局部变量,但不会影响该字段,该字段仍未初始化。您需要删除P4Board [][]
以将其从变量声明更改为现有字段的分配。 (就像你写this.nbLines = ...
来分配字段一样)
答案 2 :(得分:1)
您正在构造函数中重新定义P4Board [][] position
,然后调用未初始化的this.position
(即为null)。
答案 3 :(得分:1)
仔细看看!您正在隐藏实例变量&gt; P4Board [][] position = new P4Board [nbLines][nbColumns];
答案 4 :(得分:1)
正如其他人所说,您正在使用局部变量隐藏实例变量。您应该查看checsktyle,因为它有checks to tell you if you have made such a mistake。另外两个工具是PMD和FindBugs。
答案 5 :(得分:0)
您的假设不正确。尝试在你的作业中查找更高的几行。
答案 6 :(得分:0)
这适合我。我代替了P4Board,因为你没有提供它:
public class P4Game
{
private int nbLines;
private int nbColumns;
private int [][] position;
public static void main(String[] args)
{
P4Game game = new P4Game(3, 3);
System.out.println(game);
}
public P4Game(int nbLines, int nbColumns)
{
this.nbColumns = nbColumns;
this.nbLines = nbLines;
this.position = new int[this.nbLines][this.nbColumns];
for (int i=0; i < this.nbLines; i++)
{
for (int j=0; j < this.nbColumns; j++)
{
this.position[i][j] = i+j;
}
}
}
public String toString()
{
StringBuilder builder = new StringBuilder(1024);
builder.append('[');
for (int i = 0; i < this.nbLines; ++i)
{
builder.append('{');
for (int j = 0; j < this.nbColumns; ++j)
{
builder.append(this.position[i][j]).append(',');
}
builder.append('}');
}
builder.append(']');
return builder.toString();
}
}