selbst erstellte Hashtabelle -- Warum Exception?

Javacus

Mitglied
Hallo 🙂,

ich bin gerade am Verzweifeln, habe mir eine eigene Hashtabelle gebaut und möchte nun diese als Array meines selbst erstellten Datentyps "Entry" laufen lassen, also:

Entry[] hashtabelle = new Entry[n];

wobei n die vom Nutzer bestimmte Hashtabellengröße sein soll. Nur leider klappt diese Initialisierung anscheinend nicht, da ich zur Laufzeit eine NullPointerException um die Ohren geworfen krieg, sofern ich nur aufs Array zugreifen will.

z. B. dann:

hash[0].set_wert(3); --> NullPointerException

Mein Quellcode sieht folgendermaßen aus:
Ach ja evtl. logische Fehler bei der insert() oder contains() Funktion (die delete z.B. fehlt komplett) sind erstmal egal, ich habe dahingehend noch nix kontrolliert, ob das so richtig ist, ich "lerne" ja noch den Datentyp des Hashs kennen. -- Mir geht es erstmal nur um die Exception

Das ist der Entry:

Java:
public class Entry{
  private int wert;
  private char flag;

  public Entry(){
    flag = 'f';
  }
  
  public int get_wert(){
    return wert;
  }
  
  public void set_wert(int x){
    wert = x;
  }
  
  public char get_flag(){
    return flag;
  }
  
  public void set_flag(char x){
    flag = x;
  }
  
  
}

Und das ist die Hashtabelle,

Java:
class Hash{
  private int n = 0;
  private int m; //Groesse des Hash-Arrays
  private Entry[] hash;
  
  public void create_hash(int x){
    m = x;
    hash = new Entry[m];
  }
  
  public float get_loadFactor(){
    return (n/m);
  }
  
  public boolean contains(int x){
     int index = x%m;
     int i = 0;
     
     while(true){
     
     if(hash[index].get_wert() == x){
       return true;
     }
     
     if(hash[index].get_wert() != x || hash[index].get_flag() == 'g'){
       i++;
       index = index + i;
     }
     
     if(hash[index].get_flag() == 'f'){
       return false;
     }
     
     }

    }
    
    public void insert(int x){
      int index = x%m;
      int i = 0;
      
      while(true){

      if(hash[index].get_flag() == 'f' || hash[index].get_flag() == 'g'){
        hash[index].set_wert(x);
        hash[index].set_flag('b');
        break;
      }
      else{
        i++;
        index = index + i;
      }
      
      }
    }
    
    public void ausgabe(){
    
    for(int i = 0; i < m; i++){

      if(hash[i].get_flag() == 'f'){
        System.out.println("Wert: |/|" + "\t");
        System.out.println("Flag: b" + "\t");
      }
      if(hash[i].get_flag() == 'g'){
        System.out.println("Wert: |/|" + "\t");
        System.out.println("Flag: g" + "\t");
      }
      if(hash[i].get_flag() == 'b'){
        System.out.println("Wert = " + hash[i].get_wert() + "\t");
        System.out.println("Flag: b" + "\t");
      }
    }

    }
  } //Ende Klasse}

und hier ist die main(), die ich mal testweise geschrieben habe.

Java:
public class Hash_main {

  public static void main(String[] args) {
  
     Hash hash = new Hash();

     hash.create_hash(100); 
     hash.insert(5); //--> hier passiert schon die NullPointerException, warum?
     hash.insert(82);
     hash.insert(12);
     hash.ausgabe();

  }
}

Ich hoffe jemand kann mir helfen, ich sitze schon stundenlang und finde das Problem einfach nicht.
 
In deiner Methode createHash schreibst du:
Java:
hash = new Entry[m];
Damit erstellst du dir nur ein Array, alle Elemente darin sind immernoch null.
Danach rufst du insert auf, und willst auf die Entries zugreifen:
Java:
hash[index].get_flag()
Dann knallts natürlich 😉
 
Ohhh neiiin, dass ich das nicht gesehen habe, das ist mir ja schon "bisschen" peinlich ;-) ...aber ich hätte wohl noch drei Stunden den Quellcode angucken können, den Fehler gefunden hätte ich wohl doch nicht...

Vielen, vielen Dank an euch! 🙂
 

Zurück
Oben