为什么抛出NullPointerException?

时间:2017-01-12 09:00:35

标签: java arrays nullpointerexception

我有以下程序扫描二维矩阵并检查行和列中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”一书中解答几个问题,上面提到的是章节和字符串中的一个问题。上述解决方案也在书中给出

1 个答案:

答案 0 :(得分:6)

使用&#34;小&#34; boolean,而不是Boolean类作为数组的类型,因此所有字段都将使用false而不是null进行初始化(后者会导致您的NullPointerException )。

补充说明:Boolean是一个类,因此编译器对这样的行执行所谓的 autoboxing

Boolean b = null;
if (b) 

变为

Boolean b = null;
if (b.booleanValue())

很明显,在.booleanValue()上调用null并不是一个好主意。