1

NullPointerExceptionにエントリを入れようとすると、取得し続けHashTableます。私はそれが私のプライベートなサイズ変更方法ではなく、私のハッシュ方法と関係があると思います。方法は以下の3つです。また、配列がインスタンス化されると、すべての値が 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 { private K key; プライベート 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;
}
4

1 に答える 1

0

もしも

すべての値が null に設定されています

のすべての要素がtable初期null化の後であることを意味し!table[hashVal].isAvailable()ます。

Java では、オブジェクトの変数は参照です。したがってtable、 のリファレンスですEntry[]。あなたはそれをコンテナと想像するかもしれません。各要素table[i]も参照です。機能させるには、 type のオブジェクトのインスタンスを指す必要がありますEntry。コードtable[i]=nullでは、これらの参照が何も指していないことを意味します。これらはヌル ポインターと呼ばれます。ヌルポインタのメソッド呼び出しは不正です。NullPointerExceptionそのため、コードは上記の場所で報告されます。

だからあなたがしなければならないのはに置き換えるtable[i]=nullことだけtable[i]=new Entry<K,V>()です。このnewコマンドはインスタンス化を行い、物理メモリを割り当ててオブジェクトのコピーを作成します。Entryこれは、を初期化するコードが実行されたときだけであることに注意してください。インスタンス化後、そのインスタンスへの次の関数呼び出しが有効になります。論理的には、そのインスタンスによって表されるハッシュ スロットはまだ占有されていません。

オブジェクトの論理的役割とマシン表現を混在させていると思いますEntry。の論理的な役割はEntry、ハッシュ スロットを表すことです。しかし、マシンがインスタンス化してそれを生成しない限り、それが行う凝った作業はすべて失敗します。

于 2013-02-20T05:20:22.907 に答える