2013-02-20 17 views
1

当我试图将条目放入我的HashTable时,我总是收到NullPointerException。我不认为它是我的私有调整方法,而是与我的散列方法有关。以下三种方法。此外,当数组被实例化时,所有的值都被设置为null,并且它们的布尔可用性被设置为true。布尔可用性是为了查看添加下一个条目的位置(如果它们具有匹配的散列值),因为我们正在执行线性探测实现。继续在这个散列表推送方法中获得NullPointerExecption

public V put(K key , V value) { 
    V v = null; 
    int hashVal = hash(key); 
    size++; 
    if (size >= maxSize) { 
     resize(); 
    } else { 
     while (!table[hashVal].isAvailable()) { 
      hashVal++; 
     } 
     table[hashVal]=newtable[hashVal] Entry<K= new Entry < K,V> V > (key, value); 
     table[hashVal].setAvailable(false); 
     return value; 
    } 
    return v; 
} 

private void resize() { 
    int _length = 2*length;2 * length; 
    maxSize = (int) MAX_LOAD_FACTOR * _length; 
    Entry<KEntry < K,V>[] V > [] old = table; 
    table=table = new Entry[_length]; 
    size=0;size = 0; 
    for (int i=0;i<oldi = 0; i < old.length; i++) { 
     if (!old[i].isAvailable()) { 
      put(old[i].getKey(), old[i].getValue()); 
     } 
    } 
} 

private int hash(Object o) { 
    return (o.hashCode() % length); 
} 

这里是我的入门级: 公共静态类条目{ 私人K键;私人V值为 ; 私有布尔可用;

public Entry(K key, V value) { 
     this.setKey(key); 
     this.setValue(value); 
     this.setAvailable(true); 
    } 

    public void setKey(K key) { 
     this.key = key; 
    } 

    public K getKey() { 
     return this.key; 
    } 

    public void setValue(V value) { 
     this.value = value; 
    } 

    public V getValue() { 
     return this.value; 
    } 

    public boolean isAvailable() { 
     return available; 
    } 

    public void setAvailable(boolean available) { 
     this.available = available; 
    } 
} 

我在我的put方法的while循环中得到了NPE。

这里是我的初始化我的哈希表加几个本地变量

private int length, size; 
private int maxSize; 

/** 
* The underlying array for this hashtable 
*/ 
private Entry<K,V>[] table; 


public HashTable() {this(11);} 

@SuppressWarnings("unchecked") 
public HashTable(int length) { 
    this.length=length; 
    table=new Entry[length]; 
    for(int i=0;i<table.length;i++) { 
     table[i]=null; 
    } 
    maxSize=(int)(MAX_LOAD_FACTOR * length); 
    size=0; 
} 
+1

你有堆栈吗? – 2013-02-20 04:58:48

+0

请注意[家庭作业标签现已正式弃用](http://meta.stackexchange.com/q/147100/182862) – 2013-02-20 05:00:45

+0

您在哪条线上获得例外? – 2013-02-20 05:02:41

回答

0

如果

所有值都设置为null

构造意味着所有元素初始化后tablenull!table[hashVal].isAvailable()第一次会怎么样?

对象的java变量是引用。因此tableEntry[]的参考。你可以把它想象成一个容器。每个元素table[i]也是一个参考。要使其工作,您必须将其指向Entry类型对象的instance。在你的代码table[i]=null意味着这些引用没有指向任何东西。它们被称为空指针。调用空指针的方法是非法的。这就是为什么你的代码在我上面提到的地方报告NullPointerException

所以你所要做的就是把table[i]=null换成table[i]=new Entry<K,V>()new命令执行实例化,其分配物理内存来制作对象的副本。请注意,这只是您执行初始化Entry的代码的时间。实例化后,对该实例的以下函数调用变得合法。在逻辑上,由该实例表示的散列槽仍未被占用。

我想你已经混合了逻辑角色和Entry对象的机器表示。 Entry的逻辑角色是表示一个散列槽。但是,除非机器通过实例化生成它,否则它所做的所有奇特工作都将失败。

+0

,因为布尔可用性与表中的元素是否为空无关......仅当元素可用性设置为true时,表示表中的索引当前可用于放入新条目。在第一次添加一个条目时,table [hashVal] .isAvailable()应该返回true,因为它在初始化时设置为true ...因此它应该跳过while循环并且只将条目放在hashVal索引处。 – hunt 2013-02-20 05:31:36

+0

你最好在这里粘贴_initialization code_。 – fredfsh 2013-02-20 05:43:49