当我随机生成一个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方法。
如果你能找到导致空指针异常的原因,那将非常有帮助。感谢。
答案 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;
}