我正在测试我的数组是否为空,但由于某种原因我总是得到一个空指针异常。我不明白,因为我的测试实际测试的值是否为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;
答案 0 :(得分:2)
NullPointer异常可能是因为:
table
为空,或table[index].getKey()
返回null 在案例1中,表达式table[index] != null
的评估是从表数组中读取项目。如果table为null,这将抛出NullPointerException。
在第2种情况下,如果table[index].getKey()
返回null,则表达式table[index].getKey().equals(key)
在空对象引用上调用方法(等于),从而导致异常。
答案 1 :(得分:2)
如果table
是null
。执行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())