私はコンピュータサイエンスの学生で、Javaの初心者プログラマーです。誰かが私に、彼らがかなり基本的な地雷探査プログラムを作成しなければならない任務を手伝うように頼んだ。このプログラムは、旗鉱山をまったく利用していませんが、他の鉱山スイーパーゲームと機能的に同じです。地雷除去プログラムのNullPointerException
プログラムを実行しようとすると、NullPointerExceptionが発生しています。私はこれが何を意味するのかを調べて、これが本当にNoObjectExceptionかDereferenceExceptionであるべきであることを知っていますが、私はまだ問題を解決することにはほど遠いです。
この例外は、TileクラスのmakeFieldメソッドが呼び出されたときに発生します。また、私は実際に静的対非静的、一般対個人、適切な継承の周りに私の頭を包み込みたいと思っています。これらの相互関係はどのように関係しているのですか?
私は、メインファイル、タイルスーパークラス、およびタイルクラスの2つのサブクラス、Bombと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のための便利なデバッグツールです。実際に参照が実際にnullであることを確認し、そこから戻ってきます。 – rtheunissen