2013-02-20 16 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