所以我是一名计算机科学专业的学生,也是一名Java初学程序员。有人要求我帮助他们完成一项任务,他们必须创建一个非常基本的扫雷计划。这个程序根本不使用标志性矿山,但除此之外,它在功能上与其他扫雷机游戏相同。扫雷程序中的NullPointerException
当我尝试运行该程序时遇到了NullPointerException。我研究了这可能意味着什么,现在知道这应该是NoObjectException或DereferenceException,但我仍然没有更接近解决问题。
当调用Tile类的makeField方法时会出现此异常。此外,我真的试图围绕适当的继承,静态与非静态,公有与私有,以及所有这些相互关联的问题,所以我很抱歉,如果这是一个总问题。
所以,我有一个主文件,一个Tile超类,以及两个子类 - 炸弹和Flat。炸弹是一块带有炸弹的瓦片,Flat是不是炸弹的瓦片。
public class MineSweeperMain{
public static void main(String[] args)
{
Scanner kybd = new Scanner(System.in);
int dimension;
Tile[][] gameBoard;
System.out.print("Enter the dimension of the board you would like to play on:\t");
dimension = kybd.nextInt();
gameBoard = Tile.makeField(dimension);
Tile.printField(gameBoard, dimension);
}
}
//
public class Tile {
static Random rand = new Random();
boolean isBomb;
boolean isRevealed;
int posX, posY;
int noOfAdjacentMines;
public Tile()
{
isRevealed = false;
}
public static int detectMines(Tile[][] board, int dimensions)
{
int detectedMines = 0;
for(int i = 0; i < dimensions; i++)
{
for(int j = 0; j < dimensions; j++)
{
if(board[i][j].isBomb)
detectedMines++;
}
}
return detectedMines;
}
public static Tile[][] makeField(int dimensions)
{
int rowOfMines = dimensions/3;
int randomInRow;
Tile[][] Board = new Tile[dimensions][dimensions];
for(int i = 0; i < dimensions; i++)
for(int j = 0; j <= rowOfMines; j++)
{
randomInRow = rand.nextInt(dimensions);
Board[i][randomInRow] = new Bomb();
}
for(int i = 0; i < dimensions; i++)
for(int j = 0; j < dimensions; j++)
{
if(!Board[i][j].isBomb)
Board[i][j] = new Flat();
}
return Board;
}
public static void printField(Tile[][] board, int dimensions)
{
for(int i = 0; i <= dimensions; i++)
{
for (int j = 0; j <= dimensions; j++)
{
if(i ==0)
System.out.print(i + " ");
else if(j == 0)
System.out.print(j + " ");
else
{
if(board[i-1][j-1].isRevealed && !board[i-1][j-1].isBomb)
System.out.print(board[i-1][j-1].noOfAdjacentMines + " ");
else
System.out.print("# ");
}
}
}
}
}
//
public class Flat extends Tile{
public Flat()
{
noOfAdjacentMines = 0;
isBomb = false;
isRevealed = false;
}
}
//
public class Bomb extends Tile{
public Bomb()
{
isBomb = true;
isRevealed = false;
}
}
//
哪里是NullPointerException? (哪个语句?) – RussS 2012-02-08 21:36:35
读取异常的堆栈跟踪。这不是毫无意义的垃圾。它告诉你在代码中异常发生的位置,以及抛出异常时整个调用堆栈是什么。如果您不理解它,请将其发布到您的问题中,然后告诉我们它指向哪一行代码。 – 2012-02-08 21:37:10
1)类应以大写字母开头,变量名称以小写字母开头。 2)'System.out.println'对于一个简单的NullPointerException来说是一个方便的调试工具,只是为了查看什么引用实际上是空的,并从那里开始工作。 – rtheunissen 2012-02-08 21:38:24