我正在通过java实现哈希表。当我实现下面的代码时,我得到一个NullPointer异常错误,但是如果我用类别HashTable中的void put(int key,int value)替换else语句,则使用语句kv [key] = new KeyValue(key,value);有用!有人能解释为什么会这样吗?请帮忙!
public class KeyValue {
int key;
int value;
KeyValue(int k, int v)
{
key = k;
value = v;
}
public int getKey(){
return key;
}
public int getValue()
{
return value;
}
public void put(int k, int v)
{
key = k;
value = v;
}
}
public class HashTable{
KeyValue[] kv;
HashTable(){
kv = new KeyValue[4];
for (int i=0; i<4 ; i++)
{ kv[i]=null;
}
}
void put(int key, int value)
{
if((kv[key]!=null) || (key<0 && key>=4))
{
;
}
else
{
kv[key].put(key,value);
}
}
int get(int key)
{
int value;
value=kv[key].getValue();
return value;
}
public static void main(String[] a){
HashTable h = new HashTable();
h.put(1,2);
System.out.println(h.get(1));
}
}
答案 0 :(得分:6)
您正在使用null初始化kv[key]
。因此,如果您执行kv[key].callSomeMethod
,则会得到NullPointerException
,因为没有对象可以调用方法。
您可以使用KeyValues
的默认构造函数初始化您的HashTable
,如Peter Radar所说或使用KeyValue
的构造函数执行此操作。
HashTable(){
kv = new KeyValue[4];
for (int i=0; i<4 ; i++)
{
kv[i]=new KeyValue();
}
}
现在,KeyValue
类型的对象存储在kv[i]
中,您可以使用其方法。
答案 1 :(得分:1)
为了回答你的问题,我相信kai和Peter Rader发现了这个问题。但是,我建议您更改代码中的其他内容。
KeyValue.put
方法应重命名为set
或完全删除。如果KeyValue
应该是一个可变数据对象,那么基本问题就在这里。
在HashTable.put
中,您的代码if((kv[key]!=null) || (key<0 && key>=4))
应该显示为if ((kv[key]!=null) || key<0 || key>=4)
(此外,您当然应该使用变量替换4
,这样您也可以拥有更大的HashTable)。
由于您尝试从中学到一些东西,我还建议您尝试将KeyValue[] kv;
替换为Collection。