尝试测试数组是否为空时,Null Pointer异常

时间:2014-12-14 03:11:00

标签: java arrays nullpointerexception

我正在测试我的数组是否为空,但由于某种原因我总是得到一个空指针异常。我不明白,因为我的测试实际测试的值是否为null。这是卡住的代码。我在While循环上得到空指针:

private int findIndex(String key) {
        int index = calculateHashCode(key);
        while (table[index] != null && !table[index].getKey().equals(key)) {
            index = (index + 1) % TABLE_SIZE;
        }
        return index;
    }

修改

表声明如下:

static HashEntry[] table;

3 个答案:

答案 0 :(得分:2)

NullPointer异常可能是因为:

  1. table为空,或
  2. table[index].getKey()返回null
  3. 在案例1中,表达式table[index] != null的评估是从表数组中读取项目。如果table为null,这将抛出NullPointerException。

    在第2种情况下,如果table[index].getKey()返回null,则表达式table[index].getKey().equals(key)在空对象引用上调用方法(等于),从而导致异常。

答案 1 :(得分:2)

如果tablenull。执行table[index]取消引用数组的行为导致NullPointerException。空数组不是空数组。空数组大致对应于根本没有数组的事实,table变量指向任何数据。

请区分空数组,空数组和非空数组中的空元素。

数组为空:

table == null

数组为空:

table.length == 0

数组中的元素0为空:

table[0] == null

同样,您无法从null对象调用方法。如果table[index]返回null元素,则调用getKey()可能会导致NullPointerException。如果getKey()为null然后尝试在其上调用equals(),则同样如此。

请注意,未初始化的数组是隐式null。确保实际初始化数组。

答案 2 :(得分:1)

您的table未初始化,声明为

static HashEntry[] table = new HashEntry[TABLE_SIZE];

因此它不是空的。

另外,如果HashEntry.getKey()可以返回null,请务必检查一下(或者只是翻转等号,即!key.equals(table[index].getKey())