我从一个完全正常的2D阵列矩阵程序开始。我将其大部分转换为实现同一内容的链表版本。当前(使用.printStackTrace),我发现我的空指针异常来自此行-> matrix.setValue(matrixRow,matrixColumn,value);
调用setValue并在此抛出错误-> a [x] [y] = value; //此行中的错误
我希望包含足够的代码,如果更多信息有帮助,请告诉我。目前需要编码中断。非常感谢。
else { //matrix creation
matrix = new Node();
int matrixRow = 1;
int matrixColumn = 1;
for (int i = 1; i <= matrixSize; i++) {
//scanner one line at a time
scanner = new Scanner(fileIO.getNextLine());
if (scanner.hasNextDouble()) {
while (scanner.hasNextDouble()) {
value = scanner.nextDouble();
matrix.construct(matrixRow, matrixColumn);
matrix.setValue(matrixRow, matrixColumn, value);
matrixColumn++;
}//while
matrixRow++;
matrixColumn = 1;
}//if
}//for
if (matrix.isSquare()) {
determinant = matrixMaths.determinate(matrix);
fileIO.writeToOutput(matrix.toString());
fileIO.writeToOutput("The determinant is: " + String.valueOf(determinant));
fileIO.writeToOutput("\n\n");
} else {
errorMsg = "\n\nMatrix is not square.\n\n";
fileIO.writeToOutput(errorMsg);
}//else
}//else matrix creation
Node construct(int n, int m) {
Node[][] a = new Node[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
Node ptr = new Node();
ptr.data = a[i][j];
ptr.right = null;
ptr.down = null;
a[i][j] = ptr;
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (j != n - 1)
a[i][j].right = a[i][j + 1];
if (i != n - 1)
a[i][j].down = a[i + 1][j];
}
}
return a[0][0];
}
public void setValue(int x, int y, double value) {
a[x][y] = value; //error in this line
if (x > sizeX) {
sizeX = x;
}
if (y > sizeY) {
sizeY = y;
}
}
*编辑* 在调用setValue之前,我已经放入了system.out语句,以查看是否将1的值传递给了数组。该方法只能做到这一点,直到出现错误为止。 因此,setValue(matrixRow,matrixColumn,value)-> setValue(1,1,value);首先通过while循环。我改成了这个
int matrixRow = 0;
int matrixColumn = 0;
,但是在这里得到新的错误(construct方法中的最后一个返回值):
return a[0][0];
另一个arrayOutOfBounds ... 我将尝试再次遵循逻辑,但不确定在哪里进行修复。请帮助! 并且更改row / column = 2也会再次获得NUllPtr。
因此,进行了一些更改,并且还在不断扩展...
} else { //matrix creation
matrix = new Node();
int matrixRow = 0;
int matrixColumn = 0;
System.out.println("\n" + "matrixSize " + matrixSize);
for (int i = 1; i <= matrixSize; i++) {
//scanner one line at a time
scanner = new Scanner(fileIO.getNextLine());
if (scanner.hasNextDouble()) {
while (scanner.hasNextDouble()) {
value = scanner.nextDouble();
System.out.println(matrixRow + " row number");
System.out.println(matrixColumn + " column number");
System.out.println(value + " value");
matrix.construct(matrixRow, matrixColumn, value);
matrixColumn++;
}//while
matrixRow++;
matrixColumn = 1;
}
我的输入是这个...
3
3 -2 4
-1 5 2
-3 6 4
输出通过矩阵大小1和2。它到达第三矩阵第3行第0列。在第3行第0行,我再次遇到ArrayIndexOutOfBounds错误。
我可以使用它,但是在设置值时遇到麻烦,但是....该项目将是一个“矩阵作为链接列表”,这与之前的分配“矩阵作为2D数组”不同。所以也许我的结构一开始是不正确的?此外,“我的节点”类是单独的(作为实现接口的ADT)。有一个整体的“另一类”来寻找行列式。现在不担心这一点。同样,我们在输入中的矩阵数据之前的行中获得了“矩阵大小”。再次谢谢你!
**无法入睡编辑... 此构造贯穿整个输入文件。所以现在我只需要弄清楚在哪里设置值。 (此处未分配值,因此除非有办法解决,否则我可能会删除它。)
void construct(int n, int m, double value) {
System.out.println("construct " + n + " n " + m + " m " + value + " value");
Node[][] a = new Node[n + 1][m + 1];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
Node ptr = new Node();
ptr.data = a[i][j];
ptr.right = null;
ptr.down = null;
a[i][j] = ptr;
a[i][j].right = a[i][j + 1];
a[i][j].down = a[i + 1][j];
}
}
}
答案 0 :(得分:1)
似乎有一个错误。如果我们替换值:
int matrixRow = 1;
int matrixColumn = 1;
在声明的内容中,我们看到您正在a[1][1]
处访问数组,但是您声明的数组大小为Node[][] a = new Node[1][1];
(用上面的值替换n和m时) 。这意味着setValue唯一可访问的元素是a[0][0]
(因为数组的长度为size - 1
。
我建议您在setValue函数上执行数组边界检查if语句,这样您就可以更加轻松地捕获此类错误。检验我的理论的另一种方法是将matrixRow和matrixColumn设置为2,并在setValue函数的开头为该数组插入调试打印语句,并查看填充的第一个元素是什么。
编辑: 在构造函数中出现错误的原因是因为您正在创建零长度数组,然后尝试访问其第一个元素(有关Java中零长度数组的更多信息,请参见Why does Java allow arrays of size 0?)
我不知道您的项目的性质,但是我建议您将代码的逻辑分开。似乎您将矩阵表示为“ Node
”的数组,并且事先知道了矩阵的大小。
如果是这样,我建议将您的矩阵表示为一个类,并使该构造方法返回该类的实例。
至少,我看不出为什么您需要在while循环内创建矩阵的原因。预先创建它,以后再填充它。