LinkedList矩阵,设置值时为空指针异常

时间:2018-07-29 20:13:20

标签: java matrix nullpointerexception linked-list

我从一个完全正常的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];
        }
    }
}

1 个答案:

答案 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循环内创建矩阵的原因。预先创建它,以后再填充它。