gpt4 book ai didi

java - 扫雷程序中的 NullPointerException

转载 作者:搜寻专家 更新时间:2023-11-01 01:08:42 25 4
gpt4 key购买 nike

所以我是一名计算机科学专业的学生,​​也是一名初出茅庐的 Java 程序员。有人让我帮助他们完成一项任务,他们必须创建一个非常基本的扫雷程序。该程序根本不使用标记地雷,但除此之外它在功能上与任何其他扫雷游戏相同。

当我尝试运行该程序时遇到了 NullPointerException。我已经研究了这可能意味着什么,现在知道这实际上应该是一个 NoObjectException 或 DereferenceException,但我离解决这个问题还差得很远。

当调用 Tile 类的 makeField 方法时会出现此异常。另外,我真的在努力思考正确的继承、静态与非静态、公共(public)与私有(private)以及所有这些如何相互关联,所以如果这是一个完全菜鸟的问题,我很抱歉。

因此,我有一个主文件、一个 Tile 父类(super class)和两个 tile 类的子类 - Bomb 和 Flat。炸弹是一个里面有炸弹的方 block ,Flat 是任何不是炸弹的方 block 。

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;
}

}

//

最佳答案

我认为您的问题出在 makeField 方法的第二个循环中。

当您检查 if(!Board[i][j].isBomb) 时,该特定值将为 null,因为您尚未完全填充数组。第一个循环放置了几个随机炸弹,但其余值为空。

我会建议反转你的循环。首先循环遍历所有内容,并在不检查任何内容的情况下使整个板由 Flat 组成。

然后在你的第二个循环中,你只需用 Bomb 覆盖几个 Flat

另一种解决方案就是进行这个微小的修改并检查是否为空:

if(null == Board[i][j] || !Board[i][j].isBomb)

请注意,如果采用此解决方案,空值检查必须是FIRST。这是因为一个叫做 short-circuting 的东西。 .

我推荐我的第一个解决方案的原因是切换循环是因为它消除了一次额外的比较,不是什么大不了的事,但你永远不知道......

关于java - 扫雷程序中的 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9201772/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com