我有以下程序扫描二维矩阵并检查行和列中0的位置,并使整个行和列(行和列中存在0),矩阵中的0。
public static int[][] makeMatZero(int[][] matrix){
Boolean[] row = new Boolean[matrix.length];
Boolean[] col = new Boolean[matrix[0].length];
for(int i = 0;i< matrix.length;i++){
for(int j = 0;j< matrix[0].length;j++){
if(mat[i][j]==0){
row[i]=true;
col[j]=true;
}
}
}
for(int i = 0;i<row.length;i++){
if(row[i]){
removeRow(i,mat);
}
}
for(int i = 0;i<col.length;i++){
if(col[i]){
removeCol(i,mat);
}
}
return matrix;
}
public static void removeRow(int row, int[][] mat){
for(int j = 0;j<mat[0].length;j++){
mat[row][j]=0;
}
}
public static void removeCol(int col, int[][] mat){
for(int j = 0;j<mat.length;j++){
mat[j][col]=0;
}
}
我在行if(row [i])中得到一个nullPointerException,如果我将它注释掉,我在if(col [i])中得到一个异常。我尝试调试并打印出i和row.length / col.length的值。 i的值永远不会越过row.length / col.length,但我仍然得到nullPointerException。任何帮助让我知道错误是多么值得赞赏。
P.S:我试图在Gayle Laakmann McDowell的“Cracking the coding Interview”一书中解答几个问题,上面提到的是章节和字符串中的一个问题。上述解决方案也在书中给出答案 0 :(得分:6)
使用&#34;小&#34; boolean
,而不是Boolean
类作为数组的类型,因此所有字段都将使用false
而不是null
进行初始化(后者会导致您的NullPointerException
)。
补充说明:Boolean
是一个类,因此编译器对这样的行执行所谓的 autoboxing :
Boolean b = null;
if (b)
变为
Boolean b = null;
if (b.booleanValue())
很明显,在.booleanValue()
上调用null
并不是一个好主意。