我从一个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("nn");
} else {
errorMsg = "nnMatrix is not square.nn";
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;
但是在这里得到新的错误(构造方法中的最后一个返回(:
return a[0][0];
另一个数组越界。。。我将再次尝试遵循逻辑,但还不确定在哪里进行修复。救命!将行/列更改为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数组的矩阵"。那么,也许我的结构一开始就不正确?此外,My Node类是独立的(作为实现接口的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];
}
}
}
这似乎是一个错误。如果我们替换值:
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允许大小为0的数组?有关Java中零长度数组的更多信息(
我不知道你的项目的性质,但我建议你把代码的逻辑分开。似乎您将矩阵表示为"Node
"的数组,并且您事先知道矩阵的大小。如果是这样,我建议将矩阵表示为一个类,并使construct方法返回该类的实例。
至少,我看不出有什么理由需要在while循环中创建矩阵。事先创建它,然后用值填充它。