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

Java 继续在此哈希表推送方法中获取NullPointerExecAction,java,nullpointerexception,hashtable,Java,Nullpointerexception,Hashtable,当我试图将一个条目放入哈希表时,我总是得到NullPointerException。我不认为这是我的私有调整大小方法,而是与我的哈希方法有关。以下是三种方法。此外,当数组被实例化时,所有值都设置为null,它们的布尔可用性设置为true。布尔值的可用性是,如果下一个条目有匹配的哈希值,那么看看在哪里添加下一个条目,因为我们正在执行线性探测实现 public V put(K key , V value) { V v = null; int hashVal = hash(key);

当我试图将一个条目放入哈希表时,我总是得到NullPointerException。我不认为这是我的私有调整大小方法,而是与我的哈希方法有关。以下是三种方法。此外,当数组被实例化时,所有值都设置为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);
}
我在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;
}
如果

所有值都设置为null

表示初始化后表的所有元素都为空,怎么会呢!表[hashVal]。是否可以第一次使用

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

所以您所要做的就是将table[i]=null替换为table[i]=new条目。新命令执行实例化,即分配物理内存以制作对象的副本。请注意,这只是执行初始化条目的代码的时间。实例化后,对该实例的以下函数调用将成为合法的。在逻辑上,该实例表示的哈希槽仍然没有被占用


我认为您已经混合了入口对象的逻辑角色和机器表示。条目的逻辑角色是表示哈希槽。但是,除非机器通过实例化产生了它,否则它所做的所有花哨的工作都会失败

你有堆栈吗?请注意,你在哪一行得到异常?NPE在哪里引发?所以你在哪一行得到它:while!表[hashVal]。是否可用?这意味着表[hashVal]==null。因为布尔值可用性与表中的元素是否为null无关……只有当元素可用性设置为true时,表示表中的索引当前可用于放置新条目。在第一次添加条目时,表[hashVal].isAvailable应该返回true,因为它在初始化时设置为true……因此它应该跳过while循环,只将条目放在hashVal索引中。
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;
}