Итак, я студент-информатика и молодой программист на Java. Кто-то попросил меня помочь им в задании, где им нужно создать довольно базовую программу тральщика. Эта программа вообще не использует мины для маркировки, но, кроме того, она функционально такая же, как и любая другая игра подметания.NullPointerException в программе подметания
Я запускаю исключение NullPointerException, когда пытаюсь запустить программу. Я исследовал, что это может означать, и теперь знаю, что это действительно должно быть NoObjectException или DereferenceException, но я все еще не ближе к решению проблемы.
Это исключение возникает, когда вызывается метод makeField класса Tile. Кроме того, я действительно пытаюсь склонить голову к правильному наследованию, статическому или нестатическому, public vs. private и тому, как все они взаимосвязаны, поэтому я сожалею, если это общий вопрос о нобе.
Итак, у меня есть основной файл, суперкласс класса и два подкласса класса плитки - Bomb и 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
ПРОЧИТАЙТЕ трассировку стека исключения. Это не бессмысленный мусор. Он сообщает вам, где именно в коде происходит исключение, и каков весь стек вызовов, когда было выбрано исключение. Если вы не понимаете этого, опубликуйте его в своем вопросе и сообщите нам, в какой строке кода он указывает. –
1) Классы должны начинаться с прописных букв, имена переменных в нижнем регистре. 2) 'System.out.println' - удобный инструмент для отладки для простого исключения NullPointerException, просто чтобы увидеть, какая ссылка на самом деле является нулевой, и отработать оттуда. – rtheunissen