2D随机生成的数组中的nullpointer异常(高斯消除)

时间:2018-05-05 05:19:39

标签: java multidimensional-array nullpointerexception

当我随机生成一个2D数组时,我发现了一个空指针异常。之前我使用过相同的方法,它从来没有给我一个空指针异常。

这是主要方法。

    public static void main(String[] args) 
    {
    int row = 5;
    int column = 6;

    double[][] matrix = new double[row][column];

    for(int i = 0; i < row; i++)
    {
        for(int j = 0; j < column; j++)
            matrix[i][j] = Math.random()*20;
    }
    b = getB(matrix, row, column);
    printArray(matrix);
    System.out.println("");
    System.out.println("");


    elimination(row, column);
    backSubstitution(row,column);
    printSolution(column);

}

调试器告诉我导致异常的行在于remove方法中的findMaxPivotRow方法。

public static void elimination(int rows, int cols)
{
    int pivotRow;
    double multiplier;

    for (int r = 0; r< rows; r++)
    {
        pivotRow = findMaxPivotRow(r, rows);
        swapRow(r, pivotRow);

        for (int i = r+1; i < rows; i++)
        {
            multiplier = matrix[i][r] / matrix[r][r];
            b[i] -= (multiplier * b[r]);

            for (int j = r; j < rows; j++)
            {
                matrix[i][j] -= (multiplier * matrix[r][j]);
            }
        }
    }
}

public static int findMaxPivotRow(int k, int rows)
{
    double max_value = matrix[k][k];
    int max_row = k;

    for (int r = k; r < rows; r++)
    {
        if (Math.abs(matrix[r][k]) > max_value)
        {
            max_value = matrix[r][k];
            max_row = r;
        }
    }
    return max_row;
}

public static void swapRow(int k, int pivotRow)
{
    double[] swap;
    double multiplier;
    double swap_b;

    swap = matrix[k];
    matrix[k] = matrix[pivotRow];
    matrix[pivotRow] = swap;

    swap_b = b[k];
    b[k] = b[pivotRow];
    b[pivotRow] = swap_b;
}

导致异常的行是此行

double max_value =  matrix[k][k];

我在线搜索了2d数组中的空指针异常,它告诉我错误是数组未初始化或代码超出边界。我非常彻底地使用了调试器,它向我展示了索引处于正确的位置。

我知道我有很多代码,但是你可以阅读main方法,前几行消除和findMaxPivotRow方法。

如果你能找到导致空指针异常的原因,那将非常有帮助。感谢。

2 个答案:

答案 0 :(得分:0)

您必须将double[][] 'matrix'中声明的main()变量传递给其他方法,以便它们可以使用它或将该变量保存为静态成员,以便所有静态方法都可以访问。

答案 1 :(得分:0)

您的方法matrix中未定义2D数组findMaxPivotRow。 您需要传递在main方法中声明的矩阵,或者需要将其声明为全局变量。

您可以在我声明为全局变量的地方看到此代码。

public class myClass{
    static double matrix[][];
    public static void main(String[] args) 
    {
        int row = 5;
    int column = 6;
        matrix = new double[row][column];

    for(int i = 0; i < row; i++)
        {
           for(int j = 0; j < column; j++)
               matrix[i][j] = Math.random()*20;
        }
        b = getB(matrix, row, column);
        printArray(matrix);
        System.out.println("");
        System.out.println("");


        elimination(row, column);
        backSubstitution(row,column);
        printSolution(column);
    }   
    public static void elimination(int rows, int cols)
    {
        int pivotRow;
        double multiplier;

        for (int r = 0; r< rows; r++)
        {
            pivotRow = findMaxPivotRow(r, rows);
            swapRow(r, pivotRow);

            for (int i = r+1; i < rows; i++)
            {
                multiplier = matrix[i][r] / matrix[r][r];
                b[i] -= (multiplier * b[r]);

                for (int j = r; j < rows; j++)
                {
                    matrix[i][j] -= (multiplier * matrix[r][j]);
                }
            }
            }   
   }    

   public static int findMaxPivotRow(int k, int rows)
   {
     double max_value = matrix[k][k];
     int max_row = k;

    for (int r = k; r < rows; r++)
        {
            if (Math.abs(matrix[r][k]) > max_value)
            {
                max_value = matrix[r][k];
                max_row = r;
             }
        }
        return max_row;
   }
}

public static void swapRow(int k, int pivotRow)
{
    double[] swap;
    double multiplier;
    double swap_b;

    swap = matrix[k];
    matrix[k] = matrix[pivotRow];
    matrix[pivotRow] = swap;

    swap_b = b[k];
    b[k] = b[pivotRow];
    b[pivotRow] = swap_b;
}