在java中实现哈希表时出现NullPointerException错误

时间:2014-04-15 10:13:21

标签: java hashmap

我正在通过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));

        }

}

2 个答案:

答案 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