2D数组和空指针异常(Java)

2D数组和空指针异常(Java),java,nullpointerexception,multidimensional-array,conways-game-of-life,Java,Nullpointerexception,Multidimensional Array,Conways Game Of Life,我真的不知道是什么导致了这个问题,但我的程序,应该是康威的人生游戏,在两代人之后崩溃了,似乎不管我做什么,我已经尝试了好几天来定位错误 我已经把原因缩小到了几个可能的领域——或者至少,我认为我有 short numNeighbors(int x, int y) { short numNeighbors; numNeighbors = 0; if(x > 0 && y > 0 && matrix[x][y] != null){

我真的不知道是什么导致了这个问题,但我的程序,应该是康威的人生游戏,在两代人之后崩溃了,似乎不管我做什么,我已经尝试了好几天来定位错误

我已经把原因缩小到了几个可能的领域——或者至少,我认为我有

short numNeighbors(int x, int y) {
    short numNeighbors; 
    numNeighbors = 0;
    if(x > 0 && y > 0 && matrix[x][y] != null){
        if (matrix[x+1][y] == true) numNeighbors++;
        if (matrix[x][y+1] == true) numNeighbors++;
        if (matrix[x+1][y+1] == true) numNeighbors++;
        if (matrix[x][y-1] == true) numNeighbors++;
        if (matrix[x-1][y] == true) numNeighbors++;
        if (matrix[x+1][y-1] == true) numNeighbors++;
        if (matrix[x-1][y+1] == true) numNeighbors++;
        if (matrix[x-1][y-1] == true) numNeighbors++;
    }
    return numNeighbors;
}
//returns the number of neighbours that a coordinate has
我假设上面的这一部分检查了2D阵列边界之外的区域,但这不可能,因为我采取了预防措施以确保不会发生这种情况。即便如此,这也是一个可能的原因

void nextGen(){
    Boolean[][] newMatrix = new Boolean[rows()][cols()];

    for (int i = 1; i < cols()-1; i++){
        for (int j = 1; j < rows()-1; j++){
        //avoiding null pointer errors
            if (matrix[j][i] == null) matrix[j][i] = false;
            //if a cell has 3 neighbours, become or stay true
            if (numNeighbors(j, i) == 3) newMatrix[j][i] = true;
            //if it doesn't have 3 neighbours, become or stay false
            else newMatrix[j][i] = false;
        }
    }

    matrix = newMatrix;
}
//makes matrix represent the next generation
void nextGen(){
布尔值[][]新矩阵=新布尔值[rows()][cols()];
for(int i=1;i
这是我对错误原因的下一个猜测,但我真的不知道什么是错误的

    for (int j = 0; j < numGenerations; j++){
        JOptionPane.showMessageDialog(null,"generation " + (j+1) + ":\n\n" + myGrid.showGrid());
        myGrid.nextGen();
    }
for(int j=0;j
我只是发布上面的内容,因为它调用了上面的块,我不想排除任何可能性

我真的不知道还有什么问题,但为了防止有人想看我项目的完整源代码,我已经发布了。事实上,所有的块都应该用大括号括起来。如果你花时间做这件事,你会节省很多次的时间。e、 g

if (matrix[j][i] == null) {
   newMatrix[j][i] = false;
}
编辑2
你的大if区块将出现边界问题。为什么不简单地使用嵌套for循环:

short numNeighbors(int x, int y) {
  short numNeighbors; 
  numNeighbors = 0;

  int xMin = Math.max(x - 1, 0);
  int xMax = Math.min(x + 1, MAX_X - 1); // MAX_X is a constant, number of columns
  int yMin = Math.max(y - 1, 0);
  int yMax = Math.min(y + 1, MAX_Y - 1); // ditto, number of rows

  for (int i = xMin; i <= xMax; i++) {
     for (int j = yMin; j <= yMax; j++) {
        if (i != x && j != y) {
           if (matrix[i][j]) {
              numNeighbors++;
           }
        }
     }
  }

  return numNeighbors;
}
short numnighbors(整数x,整数y){
短纽曼尼斯堡;
numnighbors=0;
intxmin=Math.max(x-1,0);
int xMax=Math.min(x+1,MAX_x-1);//MAX_x是一个常量,列数
int yMin=Math.max(y-1,0);
int yMax=Math.min(y+1,MAX_y-1);//同上,行数
对于(int i=xMin;i,实际上,所有的块都应该用大括号括起来。如果你花时间这样做,你会节省很多次的时间。例如

if (matrix[j][i] == null) {
   newMatrix[j][i] = false;
}
编辑2
大if块将出现边界问题。为什么不简单地使用嵌套for循环:

short numNeighbors(int x, int y) {
  short numNeighbors; 
  numNeighbors = 0;

  int xMin = Math.max(x - 1, 0);
  int xMax = Math.min(x + 1, MAX_X - 1); // MAX_X is a constant, number of columns
  int yMin = Math.max(y - 1, 0);
  int yMax = Math.min(y + 1, MAX_Y - 1); // ditto, number of rows

  for (int i = xMin; i <= xMax; i++) {
     for (int j = yMin; j <= yMax; j++) {
        if (i != x && j != y) {
           if (matrix[i][j]) {
              numNeighbors++;
           }
        }
     }
  }

  return numNeighbors;
}
short numnighbors(整数x,整数y){
短纽曼尼斯堡;
numnighbors=0;
intxmin=Math.max(x-1,0);
int xMax=Math.min(x+1,MAX_x-1);//MAX_x是一个常量,列数
int yMin=Math.max(y-1,0);
int yMax=Math.min(y+1,MAX_y-1);//同上,行数
对于(inti=xMin;i下一步,您需要:

 //avoiding null pointer errors
 if (matrix[j][i] == null) matrix[j][i] = false;
numnighbors()中的所有ifs执行相同的操作

或者更好地将所有单元格预实例化为false

//Run in constructor
for(int i ..
   for(int j ..
      matrix[j][i] = false
在nextGen中,您可以执行以下操作:

 //avoiding null pointer errors
 if (matrix[j][i] == null) matrix[j][i] = false;
numnighbors()中的所有ifs执行相同的操作

或者更好地将所有单元格预实例化为false

//Run in constructor
for(int i ..
   for(int j ..
      matrix[j][i] = false

我将在检查您的整个项目时发布另一个答案。

void nextGen(){
    Boolean[][] newMatrix = new Boolean[rows()][cols()];
您要做的是创建布尔对象数组,而不是布尔基元。

  • 布尔基元默认为false
  • 布尔对象默认为null

Java有一种称为“原语自动装箱”的东西,它可能很棘手,并且隐藏了这种“微小”的差异,正如这里看到的,这些差异实际上非常重要,

我将在检查您的整个项目时发布另一个答案。

void nextGen(){
    Boolean[][] newMatrix = new Boolean[rows()][cols()];
您要做的是创建布尔对象数组,而不是布尔基元。

  • 布尔基元默认为false
  • 布尔对象默认为null

Java有一种称为“原语自动装箱”的东西,它可能很棘手,并且隐藏了这种“smal”差异实际上很重要,如图所示,

堆栈跟踪中出现的NullPointerException是什么行号?这将是一个很好的起点。您尝试过调试它吗?在出现NullPointerException的行之前放几个断点,并检查数组值。您可以发布堆栈跟踪f吗或者您的错误?堆栈跟踪中出现的NullPointerException是什么行号?这将是一个很好的起点。您尝试过调试它吗?在出现NullPointerException的行之前放置一些断点,并检查数组值。您可以发布堆栈跟踪以查找错误吗?这是逻辑上的问题,但我没有我没有生成NPE。我这样做是为了检查矩阵[][]中可能存在的空值。我对我的代码进行了类似的检查,但似乎没有任何帮助。我也尝试过更改代码,但没有透露任何额外信息。两代人之后,我仍然会收到相同的错误和相同的崩溃。我的评论被定向到满是鳗鱼的气垫船上answer@Megafonzie:数组中的所有项都应为非null,因此您甚至不应我必须做这个检查。关于边界问题,我已经考虑过了。我在矩阵的一部分留下了一堵坐标墙,我将通过使它比需要的更宽和更高,并且只在中间做一些事情来显示它。但是你的方法更有效,我仍然感谢你的帮助!这是逻辑b的一个问题但我不会生成NPE。我这样做是为了检查矩阵[][]中可能存在的空值。我对我的代码进行了类似的检查,但似乎没有任何帮助。我也尝试过更改代码,但没有透露任何额外信息。两代人之后,我仍然会收到相同的错误和相同的崩溃。我的评论被定向到满是鳗鱼的气垫船上answer@Megafonzie:数组中的所有项