[英]Exception in thread “main” java.lang.NullPointerException but int is parsed in main method
I get the following when I run the code, however I am calling solve(4) in the main method. 运行代码时得到以下信息,但是我在main方法中调用了solve(4)。 So I am not sure why the null is there?
因此,我不确定为什么存在null? Originally I had NQueensProblem q = new NQueensProblem(4);
最初我有NQueensProblem q = new NQueensProblem(4); but that threw an error on compile.
但这在编译时引发了错误。 Any Guidance would be greatly appreciated.
任何指导将不胜感激。
Exception in thread "main" java.lang.NullPointerException at NQueensProblem.canPlace(NQueensProblem.java:60) at NQueensProblem.placeQueens(NQueensProblem.java:32) at NQueensProblem.solve(NQueensProblem.java:at at NQueensProblem.main(NQueensProblem.java:76)
NQueensProblem.solve(NQueensProblem.java:at在NQueensProblem.can(NQueensProblem.java:32)在NQueensProblem.solve(NQueensProblem.java:at在NQueensProblem。 Java:76)
public class NQueensProblem {
public int[][] solution;
public NQueensBT(int N) {
solution = new int[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
solution[i][j] = 0;
}
}
}
public void solve(int N) {
if (placeQueens(0, N)) {
//print the result
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
System.out.print(" " + solution[i][j]);
}
System.out.println();
}
} else {
System.out.println("NO SOLUTION EXISTS");
}
}
public boolean placeQueens(int queen, int N) {
// will place the Queens one at a time, for column wise
if (queen == N) {
//if we are here that means we have solved the problem
return true;
}
for (int row = 0; row < N; row++) {
// check if queen can be placed row,col
if (canPlace(solution, row, queen)) {
// place the queen
solution[row][queen] = 1;
// solve for next queen
if (placeQueens(queen + 1, N)) {
return true;
}
//if we are here that means above placement didn't work
//BACKTRACK
solution[row][queen] = 0;
}
}
//if we are here that means we haven't found solution
return false;
}
// check if queen can be placed at matrix[row][column]
public boolean canPlace(int[][] matrix, int row, int column) {
// since we are filling one column at a time,
// we will check if no queen is placed in that particular row
for (int i = 0; i < column; i++) {
if (matrix[row][i] == 1) {
return false;
}
}
// we are filling one column at a time,so we need to check the upper and
// diagonal as well
// check upper diagonal
for (int i = row, j = column; i >= 0 && j >= 0; i--, j--) {
if (matrix[i][j] == 1) {
return false;
}
}
// check lower diagonal
for (int i = row, j = column; i < matrix.length && j >= 0; i++, j--) {
if (matrix[i][j] == 1) {
return false;
}
}
// if we are here that means we are safe to place Queen at row,column
return true;
}
public static void main(String[] args) {
int N = 4;
NQueensProblem q = new NQueensProblem(N);
q.solve(N);
}
} }
If I understand the code and what's the issue here, try the following. 如果我了解代码以及此处的问题,请尝试以下操作。
public class NQueensProblem {
public int[][] solution;
public NQueensProblem(int N) {
solution = new int[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
solution[i][j] = 0;
}
}
}
public void solve(int N) {
if (placeQueens(0, N)) {
//print the result
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
System.out.print(" " + solution[i][j]);
}
System.out.println();
}
} else {
System.out.println("NO SOLUTION EXISTS");
}
}
public boolean placeQueens(int queen, int N) {
// will place the Queens one at a time, for column wise
if (queen == N) {
//if we are here that means we have solved the problem
return true;
}
for (int row = 0; row < N; row++) {
// check if queen can be placed row,col
if (canPlace(solution, row, queen)) {
// place the queen
solution[row][queen] = 1;
// solve for next queen
if (placeQueens(queen + 1, N)) {
return true;
}
//if we are here that means above placement didn't work
//BACKTRACK
solution[row][queen] = 0;
}
}
//if we are here that means we haven't found solution
return false;
}
// check if queen can be placed at matrix[row][column]
public boolean canPlace(int[][] matrix, int row, int column) {
// since we are filling one column at a time,
// we will check if no queen is placed in that particular row
for (int i = 0; i < column; i++) {
if (matrix[row][i] == 1) {
return false;
}
}
// we are filling one column at a time,so we need to check the upper and
// diagonal as well
// check upper diagonal
for (int i = row, j = column; i >= 0 && j >= 0; i--, j--) {
if (matrix[i][j] == 1) {
return false;
}
}
// check lower diagonal
for (int i = row, j = column; i < matrix.length && j >= 0; i++, j--) {
if (matrix[i][j] == 1) {
return false;
}
}
// if we are here that means we are safe to place Queen at row,column
return true;
}
public static void main(String[] args) {
int N = 4;
NQueensProblem q = new NQueensProblem(N);
q.solve(N);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.