复制实例变量后出现空指针异常?
Null Pointer Exception after making copy of instance variable?
我有一个 GridMonitorClass,它在文件中读取以获得基本网格,然后我们必须从那里获得周围的总和网格、平均网格等,我设置了一个算法来获取周围的总和网格,然后在 get我制作了(我相信)该网格的副本,然后将方法设置为 return 。但是,当测试场景尝试 运行 该函数时,它会返回一个 NullPointerException,我不确定为什么...下面是我的 GridMonitor 构造函数和 getSurroundingSumGrid 方法
GridMonitor 构造函数
// Instance Variables
private double[][] baseGrid;
private double[][] surroundingSumGrid;
private double[][] surroundingAvgGrid;
private double[][] deltaGrid;
private boolean[][] dangerGrid;
//Constructor
public GridMonitor(String fileName) {
try {
this.baseGrid = readFile(fileName);
// Get Grid Dimensions for the Remaining Grids
int baseGridXDimension = this.baseGrid.length;
int baseGridYDimension = this.baseGrid[0].length;
// Set Up Surrounding Sum Grid
this.surroundingSumGrid = new double[baseGridXDimension][baseGridYDimension];
for (int i = 0; i < baseGridXDimension; i++) {
for (int j = 0; j < baseGridYDimension; j++) {
if (i == 0 && j == 0) {
this.surroundingSumGrid[0][0] = (2 * this.baseGrid[0][0]) + this.baseGrid[0][1]
+ this.baseGrid[1][0];
} else if (i == 0 && j != 0 && j < baseGridYDimension - 1) {
this.surroundingSumGrid[0][j] = this.baseGrid[0][j] + this.baseGrid[1][j]
+ this.baseGrid[0][j - 1] + this.baseGrid[0][j + 1];
} else if (i != 0 && j != 0 && i < baseGridXDimension - 1 && j < baseGridYDimension - 1) {
this.surroundingSumGrid[i][j] = this.baseGrid[i - 1][j] + this.baseGrid[i + 1][j]
+ this.baseGrid[i][j + 1] + this.baseGrid[i][j - 1];
} else if (i == 0 && j == baseGridYDimension - 1) {
this.surroundingSumGrid[0][j] = (2 * this.baseGrid[0][j]) + this.baseGrid[1][j]
+ this.baseGrid[0][j - 1];
} else if (i == baseGridXDimension - 1 && j == 0) {
this.surroundingSumGrid[i][0] = (2 * this.baseGrid[i][0]) + this.baseGrid[i][1]
+ this.baseGrid[i - 1][0];
} else if (i == baseGridXDimension - 1 && j == baseGridYDimension - 1) {
this.surroundingSumGrid[i][j] = (2 * this.baseGrid[i][j]) + this.baseGrid[i - 1][j]
+ this.baseGrid[i][j - 1];
}
}
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
}
}
获取 SurroundingSumGrid 方法
public double[][] getSurroundingSumGrid() {
// TODO Auto-generated method stub
double[][] surroundingSumGrid = this.surroundingSumGrid;
return surroundingSumGrid;
}
编辑
我只是 return 尝试了 this.surroundingSumGrid
并且仍然面临空指针异常,所以我实际上迷失了为什么会发生这个错误
在Java中,变量按值引用arrays by reference (whereas they refer to primitive data types)。这意味着当您进行此分配时:
double[][] surroundingSumGrid = this.surroundingSumGrid;
你只是说 surroundingSumGrid
应该指向内存中与 this.surroundingSumGrid
相同的位置。要复制整个数组,您需要实例化一个新数组:
double[][] surroundingSumGrid = new double[baseGridXDimension][baseGridYDimension];
然后 copy the array contents from the old array into the new one。幸运的是,由于 double
是原始数据类型,您不必担心克隆数组中的单个对象。
不过要小心一点,因为如果每次调用 getter 时都创建一个全新的数组,您最终可能会分配大量从未使用过的内存。考虑重命名该方法,以便更清楚地表明调用此方法将导致比简单地获取字段值更多的工作。
我有一个 GridMonitorClass,它在文件中读取以获得基本网格,然后我们必须从那里获得周围的总和网格、平均网格等,我设置了一个算法来获取周围的总和网格,然后在 get我制作了(我相信)该网格的副本,然后将方法设置为 return 。但是,当测试场景尝试 运行 该函数时,它会返回一个 NullPointerException,我不确定为什么...下面是我的 GridMonitor 构造函数和 getSurroundingSumGrid 方法
GridMonitor 构造函数
// Instance Variables
private double[][] baseGrid;
private double[][] surroundingSumGrid;
private double[][] surroundingAvgGrid;
private double[][] deltaGrid;
private boolean[][] dangerGrid;
//Constructor
public GridMonitor(String fileName) {
try {
this.baseGrid = readFile(fileName);
// Get Grid Dimensions for the Remaining Grids
int baseGridXDimension = this.baseGrid.length;
int baseGridYDimension = this.baseGrid[0].length;
// Set Up Surrounding Sum Grid
this.surroundingSumGrid = new double[baseGridXDimension][baseGridYDimension];
for (int i = 0; i < baseGridXDimension; i++) {
for (int j = 0; j < baseGridYDimension; j++) {
if (i == 0 && j == 0) {
this.surroundingSumGrid[0][0] = (2 * this.baseGrid[0][0]) + this.baseGrid[0][1]
+ this.baseGrid[1][0];
} else if (i == 0 && j != 0 && j < baseGridYDimension - 1) {
this.surroundingSumGrid[0][j] = this.baseGrid[0][j] + this.baseGrid[1][j]
+ this.baseGrid[0][j - 1] + this.baseGrid[0][j + 1];
} else if (i != 0 && j != 0 && i < baseGridXDimension - 1 && j < baseGridYDimension - 1) {
this.surroundingSumGrid[i][j] = this.baseGrid[i - 1][j] + this.baseGrid[i + 1][j]
+ this.baseGrid[i][j + 1] + this.baseGrid[i][j - 1];
} else if (i == 0 && j == baseGridYDimension - 1) {
this.surroundingSumGrid[0][j] = (2 * this.baseGrid[0][j]) + this.baseGrid[1][j]
+ this.baseGrid[0][j - 1];
} else if (i == baseGridXDimension - 1 && j == 0) {
this.surroundingSumGrid[i][0] = (2 * this.baseGrid[i][0]) + this.baseGrid[i][1]
+ this.baseGrid[i - 1][0];
} else if (i == baseGridXDimension - 1 && j == baseGridYDimension - 1) {
this.surroundingSumGrid[i][j] = (2 * this.baseGrid[i][j]) + this.baseGrid[i - 1][j]
+ this.baseGrid[i][j - 1];
}
}
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
}
}
获取 SurroundingSumGrid 方法
public double[][] getSurroundingSumGrid() {
// TODO Auto-generated method stub
double[][] surroundingSumGrid = this.surroundingSumGrid;
return surroundingSumGrid;
}
编辑
我只是 return 尝试了 this.surroundingSumGrid
并且仍然面临空指针异常,所以我实际上迷失了为什么会发生这个错误
在Java中,变量按值引用arrays by reference (whereas they refer to primitive data types)。这意味着当您进行此分配时:
double[][] surroundingSumGrid = this.surroundingSumGrid;
你只是说 surroundingSumGrid
应该指向内存中与 this.surroundingSumGrid
相同的位置。要复制整个数组,您需要实例化一个新数组:
double[][] surroundingSumGrid = new double[baseGridXDimension][baseGridYDimension];
然后 copy the array contents from the old array into the new one。幸运的是,由于 double
是原始数据类型,您不必担心克隆数组中的单个对象。
不过要小心一点,因为如果每次调用 getter 时都创建一个全新的数组,您最终可能会分配大量从未使用过的内存。考虑重命名该方法,以便更清楚地表明调用此方法将导致比简单地获取字段值更多的工作。