继续在此哈希表推送方法中获取NullPointerExecption

时间:2013-02-20 04:57:15

标签: java nullpointerexception hashtable

我在尝试将条目输入NullPointerException时不断获得HashTable。我不认为它是我的私有调整大小方法,而是与我的哈希方法有关。这三种方法如下。此外,在实例化数组时,所有值都设置为null,并且其布尔可用性设置为true。布尔值可用性是看它们是否有匹配的哈希值时添加下一个条目的位置,因为我们正在进行线性探测实现。

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);
}

这是我的入门课程:     public static class Entry {         私人K钥匙;         私人V值;         private boolean available;

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

答案 0 :(得分:0)

如果

  

所有值都设置为null

表示初始化后table的所有元素都是null!table[hashVal].isAvailable()第一次如何通过?{/ p>

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

所以你要做的就是将table[i]=new Entry<K,V>()替换为newEntry命令执行实例化,它分配物理内存以生成对象的副本。请注意,这只是执行初始化Entry的代码的时间。实例化后,对该实例的以下函数调用变得合法。在逻辑上,该实例所代表的哈希槽仍未被占用。

我认为你已经混合了Entry对象的逻辑角色和机器表示。 {{1}}的逻辑角色是表示哈希槽。但它所做的所有奇特的工作都会失败,除非机器已经通过实例化生成它。