I am writing a minesweeper game in java and I a keep getting the "Exception in thread "main" java.lang.NullPointerException" error. I know this means that I'm trying to use a null variable, but I'm not sure why the variable hasn't been initialized.
Here is my code:
Minesweeper Class
import java.util.*;
public class MineSweeper {
private int numrows = 4;
private int numcols = 4;
private int numcells = numrows*numcols;
private int nummines = 4;
private Cell[][] cells;
// set up scanner for input
Scanner in = new Scanner(System.in);
public MineSweeper() {
cells = new Cell[numrows][numcols];
int minesPlaced = 0;
Random random = new Random();
// checking if any more mines need to be placed
while (minesPlaced < nummines) {
// picking random row and column
int x = random.nextInt(numrows);
int y = random.nextInt(numcols);
Cell c = cells[x][y];
// placing mines
if (c.getMined() == false) {
c.setMined(true);
minesPlaced++;
} // end if
} // end while
for (int i=0; i<numrows; i++) {
for (int j=0; j<numcols; j++) {
Cell b = cells[i][j];
int num = getAdjMineCount(i,j);
b.setAdjCount(num);
} // end for
} // end for
} // end constructor MineSweeper
public int getAdjMineCount(int i, int j) {
Cell a = cells[i-1][j-1];
Cell b = cells[i-1][j];
Cell c = cells[i-1][j+1];
Cell d = cells[i][j-1];
Cell e = cells[i][j+1];
Cell f = cells[i+1][j-1];
Cell g = cells[i+1][j];
Cell h = cells[i+1][j+1];
int mines = 0;
/* if (getAdjCell(i,j,0) = isMined) mines++;
if (getAdjCell(i,j,1) = isMined) mines++;
if (getAdjCell(i,j,2) = isMined) mines++;
if (getAdjCell(i,j,3) = isMined) mines++;
if (getAdjCell(i,j,4) = isMined) mines++;
if (getAdjCell(i,j,5) = isMined) mines++;
if (getAdjCell(i,j,6) = isMined) mines++;
if (getAdjCell(i,j,7) = isMined) mines++; */
if (a.getMined() == true) mines++;
if (b.getMined() == true) mines++;
if (c.getMined() == true) mines++;
if (d.getMined() == true) mines++;
if (e.getMined() == true) mines++;
if (f.getMined() == true) mines++;
if (g.getMined() == true) mines++;
if (h.getMined() == true) mines++;
return mines;
}
public int getMarkCount() {
int marks = 0;
for (int i=0; i<numrows; i++) {
for (int j=0; j<numcols; j++) {
Cell c = cells[i][j];
if (c.getMarked() == true) {
marks++;
} // end if
} // end for
} // end for
return marks;
} // end getMarkCount
public void show() {
for (int i=0; i<numrows; i++) {
for (int j=0; j<numcols; j++) {
Cell c = cells[i][j];
c.show();
} // end for
} //end for
}
public void uncoverAll() {
for (int i=0; i<numrows; i++) {
for (int j=0; j<numcols; j++) {
Cell c = cells[i][j];
c.setUncovered();
} // end for
} // end for
} // end uncoverAll
public Cell getAdjCell(int r, int c, int direction) {
// checking if cells are off the board
if (r == 0 && (direction == 1 || direction == 2 || direction == 3))
return null;
if (r == 3 && (direction == 5 || direction == 6 || direction == 7))
return null;
if (c == 0 && (direction == 3 || direction == 4 || direction == 5))
return null;
if (c == 3 && (direction == 1 || direction == 0 || direction == 7))
return null;
// checking each direction
if (direction == 0) return cells[r][c+1];
else if (direction == 1) return cells[r-1][c+1];
else if (direction == 2) return cells[r-1][c];
else if (direction == 3) return cells[r-1][c-1];
else if (direction == 4) return cells[r][c-1];
else if (direction == 5) return cells[r+1][c-1];
else if (direction == 6) return cells[r+1][c];
else if (direction == 7) return cells[r+1][c+1];
else return null;
}
public boolean allNonMinesUncovered() {
int count = 0;
for (int i=0; i<numrows; i++) {
for (int j=0; j<numcols; j++) {
Cell c = cells[i][j];
if (c.getMined() == false && c.getCovered() == false) {
count ++;
} // end if
} // end for
} // end for
if (count == (numcells - nummines)) {
return true;
}
else
return false;
} // end allNonMinesUncovered()
public boolean allMinesMarked() {
int count = 0;
for (int i=0; i<numrows; i++) {
for (int j=0; j<numcols; j++) {
Cell c = cells[i][j];
if (c.getMarked() == true && c.getMined() == true) {
count++;
} // end if
} // end for
} // end for
if (count == nummines) {
return true;
}
else
return false;
} // end allMinesMarked()
public void game() {
// print prompt and take input
System.out.print(">");
String string1 = in.next();
while (string1.length() != 0 ){
// splitting newArray into command and arguments
String[] newArray = string1.split("\\s");
String command = newArray[0];
int arg1 = Integer.parseInt(newArray[1]);
int arg2 = Integer.parseInt(newArray[2]);
Cell c = cells[arg1][arg2];
if (command == "show") {
show(); // prints the board
}
else if (command == "u") {
if (c.getMarked() == true) {
break; }
else if (c.getMined() == true) {
uncoverAll();
System.out.println("You lose!"); }
else {
c.setUncovered();
if (allMinesMarked() == true && allNonMinesUncovered() == true) {
System.out.println("You win!");
break;
} // end if
} // end else
} // end else if for "u"
else if (command == "m") {
if (c.getCovered() == false) {
break; }
else if (c.getMarked() == true) {
c.setMarked(true); }
else {
c.setMarked(true);
if (allMinesMarked() == true && allNonMinesUncovered() == true) {
System.out.println("You win!");
break;
} // end if
} // end else
} // end else if for "m"
else if (command == "q") {
break; // exits while loop
}
else {
System.out.println("Bad command.");
}
System.out.print(">");
string1 = in.next();
} // end while
} // end game()
public static void play() {
MineSweeper mine = new MineSweeper();
mine.game();
} // end play()
} //end class MineSweeper
Cell Class
import java.util.*;
public class Cell {
private int row, col;
private boolean covered;
private boolean marked, mined;
private int adjcount;
public Cell(int r, int c) {
row = r;
col = c;
covered = true;
marked = false;
mined = false;
adjcount = 0;
}
public void show() {
if (covered==true && marked==false)
System.out.print("?");
if (covered==true && marked==true)
System.out.print("X");
if (covered==false && mined==true)
System.out.print("*");
if (covered==false && mined==false && adjcount==0)
System.out.print("_");
if (covered==false && mined==false && adjcount > 0)
System.out.print(adjcount);
}
public boolean getMined() {
return mined;
}
public void setMined(boolean m) {
mined = m;
}
public boolean getCovered() {
return covered;
}
public void setUncovered() {
covered = false;
}
public boolean getMarked() {
return marked;
}
public void setMarked(boolean m) {
marked = m;
}
public int getAdjCount() {
return adjcount;
}
public void setAdjCount(int c) {
adjcount = c;
}
public int getRow() {
return row;
}
public int getCol() {
return col;
}
}
Driver Class
public class Driver {
public static void main(String[] args) {
MineSweeper.play();
} //end of main
} //end of class Driver
I'm getting the error on line 31 of class Minesweeper
if (c.getMined() == false) {
getMined() is returning the variable 'mined', but apparently 'mined' has not been initialized yet. I'm confused because I thought 'mined' was getting initialized to false when the 'cells' object was created through the Cell constructor. My code is nearly identical to my instructors final code so I'm not sure where my mistake is. Any ideas?
Stacktrace:
Exception in thread "main" java.lang.NullPointerException
at MineSweeper.<init>(MineSweeper.java:31)
at MineSweeper.play(MineSweeper.java:257)
at Driver.main(Driver.java:4)