Compiler-Fehler No such Field error

Castyll

Aktives Mitglied
Hallo,
Für die Universität mache ich grad eine Übungsaufgabe zu Verketteten Listen. So weit so gut, jedoch bekomm ich nun seit 1 Stunde probieren jedes mal den "No such Field error". Ich habe bereits gegoogelt und alte .class Dateien gelöscht, um das Terminal erneut kompilieren zu lassen aber der Fehler geht nicht weg. Hat jemand eine Idee woran es liegen könnte? Im Folgenden meinen Code Ausschnitt:

Java:
class Listenelement {
    Termin data;
    Listenelement next;
}

public class Liste {
 
    Listenelement head; // Pseudoelement fuer den Kopf der Liste
    Listenelement z;    // Pseudoelement fuer das Ende der Liste
 
    // leere Liste erzeugen
    public Liste(){
    head = new Listenelement();
    z = new Listenelement();
    head.data = null;
    head.next = z;
    z.data = null;
    z.next = z;
    }
 
    // Ausgabe aller Elemente der Liste
    public void print(){
    Listenelement ele = head.next;
    while (ele != z){
        System.out.println(ele.data);
        ele = ele.next;
    }
    }
 
    /*  *** Teilaufgabe (b) *** */


    public void insertSorted(Termin other){

Listenelement zeiger = head.next;

    if(zeiger.data.istVorher(other)==true)
    {
          Listenelement ele = new Listenelement();
        Listenelement zweites = new Listenelement();
        zweites = head;
        ele.next = head.next;
        ele.data = new Termin(other.tag,other.monat,other.jahr,other.todo);
        head = ele;
        head.next = zweites;
     
    }
 


 

    }




    public static void main(String[] args) {
    Liste liste1 = new Liste(); // neue Liste anlegen
    // Liste füllen
    liste1.insertSorted(new Termin(14,10,2016,"Zahnarzt"));
    liste1.insertSorted(new Termin(15,12,2016,"Klausur PP1"));
    liste1.insertSorted(new Termin(19,11,2016,"Theater"));
    liste1.insertSorted(new Termin(1,1,2017,"Konzert"));
    liste1.insertSorted(new Termin(21,12,2016,"Vortrag"));
    System.out.println("Liste 1: ");
    liste1.print();
    System.out.println("*****************");

Der Error verweist immer auf die Lines:
head.data = null;
oder
ele.data = new Termin(other.tag,other.monat,other.jahr,other.todo);

Deswegen gehe ich davon aus, dass irgendetwas mit data nicht stimmt. Was konnte ich noch nicht herausfinden. Die Klasse Termin existiert natürlich auch und auf Anfrage poste ich sie, jedoch wurde das meiste dieser Klasse von der Uni selbst vorgegeben.
Ich hoffe auf schnelle Rückmeldung
 
Poste mal bitte die Termin Klasse.

Aber du erstellst am Anfang auch eine neue Liste und fügst einen Eintrag hinzu mit:
Java:
Liste liste1 = new Liste(); // neue Liste anlegen
// Liste füllen
liste1.insertSorted(new Termin(14, 10, 2016, "Zahnarzt"));

Beim Erstellen der Liste passiert das:
Java:
public Liste() {
    head = new Listenelement();
    z = new Listenelement();
    head.data = null;
    head.next = z;
    z.data = null;
    z.next = z;
}
Beachte, dass head.data = null und z.data = null;

Beim Einfügen des ersten Elementes ist die Liste machst du dann:
Java:
Listenelement zeiger = head.next;

if (zeiger.data.istVorher(other) == true) {

zeiger=head.next ist immer noch null. Deswegen sollte eig. ein NullPointerException fliegen anstatt dein Fehler mit "no such field".
 
Zuletzt bearbeitet:
Poste mal bitte die Termin Klasse.
Java:
class Termin {
    public int tag;
    public int monat;
    public int jahr;
    public String todo;

    public Termin(int t, int m, int j, String s){
    tag = t;
    monat = m;
    jahr = j;
    todo = s;
    }

    /*  *** Teilaufgabe (a) *** */

    public boolean istVorher(Termin other)
    {
    if(this.monat<other.monat && this.jahr <= other.jahr)
    {
      return true;

    }

    if(this.tag < other.tag && this.monat <= other.monat && this.jahr <= other.jahr)
    {
      return true;

    }


    if(this.jahr < other.jahr)
    {

     return true;
    }

    else{

    return false;
    }

     }

    public String toString(){
    return tag + "." + monat + "." + jahr + "  " + todo;
    }
}

Hier ist die Termin Klasse wie gewünscht
 
Also wie oben erwähnt liegt der Fehler mMn in der insertSorted Methode. Wenn noch kein Element in der Liste ist (bzw. wenn die initalen Listenelemente noch keine Daten enthalten, dann kannst du darauf keine Methoden aufrufen, weil "data" eben noch null ist.

Also vorher überprüfen ob data überhaupt vorhanden ist. An deiner Stelle würde ich die Listenelemente auch nur zusammen mit Daten einfügen. Ein leeres Listenelement ohne Daten ergibt für mich erstmal keinen Sinn.

Würde das so in der Art probieren:
Java:
public void insertSorted(Termin other) {
    Listenelement zeiger = head;
    
    while (zeiger.next != null) {
        if (!zeiger.next.istVorher(other)) {
            //element hier einfügen
            return;
        }
        zeiger = zeiger.next;
    }
    //Element hier einfügen
}

Da musst du dann auch noch drauf achten, dass der initiale Zeiger nicht null ist etc, aber es ist ein erster Ansatz 😉
 
@Tarrew Das Problem ist, dass die Main Methode und das Einfügen der Daten dort vorgegeben waren :s Wie kann ich das also alternativ lösen? Leider haben wir in der Vorlesung nur eine Folie zu verkettete Listen gemacht und auch das Internet gibt nicht viel her.
 
Die main-Methode ist kein Problem.

Aber ich kann mir nicht vorstellen, dass die insertSorted Methode so vorgegeben war.
 
Wenn noch keine Daten da sind, dann ist data nunmal leer. Du musst es nur abfangen können.

Also vorher prüfen:
Java:
if(zeiger.data!=null){
//mache was mit data etc.
}
 
Wenn noch keine Daten da sind, dann ist data nunmal leer. Du musst es nur abfangen können.

Also vorher prüfen:
Java:
if(zeiger.data!=null){
//mache was mit data etc.
}

Achso, also so:
Java:
    public void insertSorted(Termin other){

Listenelement zeiger = head.next;
if(zeiger.data!=null){
    if(zeiger.data.istVorher(other)==true)
    {
          Listenelement ele = new Listenelement();
        Listenelement zweites = new Listenelement();
        zweites = head;
        ele.next = head.next;
        ele.data = new Termin(other.tag,other.monat,other.jahr,other.todo);
        head = ele;
        head.next = zweites;
    
    }



    }
}

Aber so wie ich es verstanden habe, ist doch Data seit Start des Programmes null, wird dann überhaupt irgendwas aufgerufen?
 
Ne da haste schon Recht. Deswegen habe ich dir oben mal ein anderen Lösungsvorschlag gemacht wie man an die Sache herangehen kann.
 
Ne da haste schon Recht. Deswegen habe ich dir oben mal ein anderen Lösungsvorschlag gemacht wie man an die Sache herangehen kann.

Ok also an 2 Stellen einfügen, dann werde ich das so probieren. Nur noch eine Frage: Wie würdest du mir das einfügen von Daten empfehlen? Man verlegt ja im Grunde die Referenzen wie ich es gemacht habe, aber das schien ja bei mir nicht zu funktionieren.
 
Also mal eine kleine Hilfestellung wie ich das machen würde:

Beim initialisieren der Liste, fügst du schon 2 Listenelemente ein. Die haben allerdings keine Termine "im Bauch". Deswegen solltest du die ganz weglassen. Deinen Konstruktor kannste damit eigentlich löschen.
Implizit würde der dann so aussehen:

Java:
    // leere Liste erzeugen
    public Liste() {

    }

Dann zum Einfügen:
Java:
    public void insertSorted(Termin other) {
        //dein Head zum iterieren über die Liste
        Listenelement zeiger = head;
       
        //das neue Element, dass eingefügt werden soll
        Listenelement item = new Listenelement();
        item.data = other;
      
        //Die Liste ist leer, also setze den Head auf das neue Element und beende die Methode
        if (zeiger == null) {
            //ToDo
        }

        //Der Termin liegt vor deinem ersten Termin, also setze head = item, und item.next = alter Head
        if (other.istVorher(zeiger.data)) {
           //ToDo
        }

       //Durchlaufe die Liste
        while (zeiger.next != null) {
           //Der einzufügende Termin liegt vor dem nächsten Termin in der Liste, also füge ihn hier ein und beende die Methode
            if (other.istVorher(zeiger.next.data)) {
                //ToDo
            }
            zeiger = zeiger.next;
        }
        //Die Liste wurde komplett durchlaufen und der neue Termin wurde noch nicht eingefügt, also hänge ihn am Ende an. 
        //ToDo
    }
 
Also mal eine kleine Hilfestellung wie ich das machen würde:

Beim initialisieren der Liste, fügst du schon 2 Listenelemente ein. Die haben allerdings keine Termine "im Bauch". Deswegen solltest du die ganz weglassen. Deinen Konstruktor kannste damit eigentlich löschen.
Implizit würde der dann so aussehen:

Java:
    // leere Liste erzeugen
    public Liste() {

    }

Dann zum Einfügen:
Java:
    public void insertSorted(Termin other) {
        //dein Head zum iterieren über die Liste
        Listenelement zeiger = head;
      
        //das neue Element, dass eingefügt werden soll
        Listenelement item = new Listenelement();
        item.data = other;
     
        //Die Liste ist leer, also setze den Head auf das neue Element und beende die Methode
        if (zeiger == null) {
            //ToDo
        }

        //Der Termin liegt vor deinem ersten Termin, also setze head = item, und item.next = alter Head
        if (other.istVorher(zeiger.data)) {
           //ToDo
        }

       //Durchlaufe die Liste
        while (zeiger.next != null) {
           //Der einzufügende Termin liegt vor dem nächsten Termin in der Liste, also füge ihn hier ein und beende die Methode
            if (other.istVorher(zeiger.next.data)) {
                //ToDo
            }
            zeiger = zeiger.next;
        }
        //Die Liste wurde komplett durchlaufen und der neue Termin wurde noch nicht eingefügt, also hänge ihn am Ende an.
        //ToDo
    }
Okay so habe ich es nun gemacht. Nur der letzte Punkt fiel mir schwer:

Java:
public void insertSorted(Termin other) {
        //dein Head zum iterieren über die Liste
        Listenelement zeiger = head;
      
        //das neue Element, dass eingefügt werden soll
        Listenelement item = new Listenelement();
        item.data = other;
     
        //Die Liste ist leer, also setze den Head auf das neue Element und beende die Methode
        if (zeiger == null) {
            head = item;
        return;
        }

        //Der Termin liegt vor deinem ersten Termin, also setze head = item, und item.next = alter Head
        if (other.istVorher(zeiger.data)) {
       Listenelement alterHead = new Listenelement();
       alterHead = head;
           head = item;
       item.next = alterHead;
        }

       //Durchlaufe die Liste
        while (zeiger.next != null) {
           //Der einzufügende Termin liegt vor dem nächsten Termin in der Liste, also füge ihn hier ein und beende die Methode
            if (other.istVorher(zeiger.next.data)) {
                Listenelement alterTermin = new Listenelement();
          alterTermin = zeiger.next;
              zeiger.next = item;
           item.next = alterTermin;
        return;
            }
            zeiger = zeiger.next;
        }
        //Die Liste wurde komplett durchlaufen und der neue Termin wurde noch nicht eingefügt, also hänge ihn am Ende an.
        //unsicher:
    zeiger.next = item;
    item.next = z;
   
   
    }
 
Okay so habe ich es nun gemacht. Nur der letzte Punkt fiel mir schwer:

Java:
public void insertSorted(Termin other) {
        //dein Head zum iterieren über die Liste
        Listenelement zeiger = head;
    
        //das neue Element, dass eingefügt werden soll
        Listenelement item = new Listenelement();
        item.data = other;
   
        //Die Liste ist leer, also setze den Head auf das neue Element und beende die Methode
        if (zeiger == null) {
            head = item;
        return;
        }
        
        //Der Termin liegt vor deinem ersten Termin, also setze head = item, und item.next = alter Head
        if (other.istVorher(zeiger.data)) {
       Listenelement alterHead = new Listenelement();
       alterHead = head;
           head = item;
       item.next = alterHead;
        }

       //Durchlaufe die Liste
        while (zeiger.next != null) {
           //Der einzufügende Termin liegt vor dem nächsten Termin in der Liste, also füge ihn hier ein und beende die Methode
            if (other.istVorher(zeiger.next.data)) {
                Listenelement alterTermin = new Listenelement();
          alterTermin = zeiger.next;
              zeiger.next = item;
           item.next = alterTermin;
        return;
            }
            zeiger = zeiger.next;
        }
        //Die Liste wurde komplett durchlaufen und der neue Termin wurde noch nicht eingefügt, also hänge ihn am Ende an.
        //unsicher:
    zeiger.next = item;
    item.next = z;
 
 
    }
Also das item am Anfang einfügen ist richtig. Danach sind 2-3 unnötige Sachen drin.
Java:
Listenelement alterHead =new Listenelement();
       alterHead = head;

Du brauchst du bei solchen Dingen kein neues Objekt. Du kannst einfach die Referenz auf ein bestehendes Objekt setzen:
Java:
Listenelement alterHead = head;

Allgemein sind die ersten zwei if-Abfragen aber richtig.

Danach wieder das gleiche:
Java:
Listenelement alterTermin =new Listenelement();
          alterTermin = zeiger.next;
besser schreiben als:
Java:
Listenelement alterTermin = zeiger.next;

Ansonsten passt das aber. Das "z" für das letzte Element halte ich persönlich für unnötig aber in Ordnung. Hab deinen Code auch getestet und das passt alles.

Vermutlich vermisst du einen Eintrag in der Ausgabe? Dann solltest du dir deine print() Methode nochmal angucken 😉
 
Also das item am Anfang einfügen ist richtig. Danach sind 2-3 unnötige Sachen drin.
Java:
Listenelement alterHead =new Listenelement();
       alterHead = head;

Du brauchst du bei solchen Dingen kein neues Objekt. Du kannst einfach die Referenz auf ein bestehendes Objekt setzen:
Java:
Listenelement alterHead = head;

Allgemein sind die ersten zwei if-Abfragen aber richtig.

Danach wieder das gleiche:
Java:
Listenelement alterTermin =new Listenelement();
          alterTermin = zeiger.next;
besser schreiben als:
Java:
Listenelement alterTermin = zeiger.next;

Ansonsten passt das aber. Das "z" für das letzte Element halte ich persönlich für unnötig aber in Ordnung. Hab deinen Code auch getestet und das passt alles.

Vermutlich vermisst du einen Eintrag in der Ausgabe? Dann solltest du dir deine print() Methode nochmal angucken 😉
Die Exception die ich die ganze Zeit hatte, ist nun weg, danke 🙂 Und die Ausgabe funktioniert auch, gott sei Dank ,die hätte ich nämlich nicht ändern können, da das vorgegeben war. Vielen, vielen Dank 🙂
 

Zurück
Oben