Methode zielnah zeigt das gewünschte Ausgabe nicht an

morry329

Mitglied
Hallo, mein Code zeigt nichts am Console beim Ausführen an (es sollte Zeichenkette wie lange (variable zielnah) entfernung? (variable entfernung) anzeigen).
Kann jemand mir vielleicht eine Hilfsstellung geben?

Java:
class Fahrt{
    Bahnhof Start, Ziel; //Zielort, Startort
    Fahrt(Bahnhof Start, Bahnhof Ziel){
        this.Start = Start;
        this.Ziel = Ziel;
    }

    boolean zielnah(Bahnhof b){
        int entfernungZumStart = berechneEntfernung(b, Start);
        int entfernungZumZiel = berechneEntfernung(b, Ziel);
         //prüfe, ob Zielentfernung großer als Startentfernung ist
        return entfernungZumZiel < entfernungZumStart;
    }

    //Fahrtentfernung berechnen
    int berechneEntfernung(Bahnhof b1, Bahnhof b2){
        int entfernung = 0;
        Bahnhof curr = b1;

        while(curr != b2){
            entfernung += curr.nS.Entfernung;
            curr = curr.nS.nB;
            //hier lauft die Schreife evtl zielros.
            //wie kann das Stoppkriterium lauten?
        }

        return entfernung;
    }
}

class BhfTesten{ //test-klasse
    public static void main(String[] args) {
        Bahnhof dortmund = new Bahnhof("Dortmund", 10, 0);
        Bahnhof duisburg = new Bahnhof("Duisburg", 18, 19);
        Fahrt obj1 = new Fahrt(dortmund, duisburg);
        Bahnhof essen = new Bahnhof(obj1, 30, "Essen", 30);
        boolean zielnah = obj1.zielnah(essen);
        int entfernung = obj1.berechneEntfernung(dortmund, essen);
        System.out.println("wie lange? " + zielnah + "entfernung? " + entfernung);
    }
}

public class Bahnhof { /*hier kann man Eigenschaften wie Dauer, Name des Bahnhofs
einlegen*/
    String Name;
    Strecke nS;
    int Ankunft;
    int Dauer;
    int Abfahrt;

    Bahnhof(Fahrt f, int Entfernung, String Name, int Dauer){
        this.Name = Name;
        this.nS = new Strecke(this, Entfernung);
        f.Ziel.nS = this.nS;

        int fahrzeit = (int)Math.ceil((double) Entfernung / 2.0);
        this.Abfahrt = f.Ziel.Abfahrt + fahrzeit;
        this.Ankunft = this.Abfahrt - Dauer;
        this.Dauer = Dauer;
    }
}

class Strecke{ //Entfernung vom bestimmten Bahnhof einlegen
    Bahnhof nB;
    int Entfernung;

    Strecke(Bahnhof Bahnhof, int Entfernung){
        this.nB = Bahnhof;
        this.Entfernung = Entfernung;
    }
}
 
Naja, das wird nicht ausgefuehrt weil es nicht kompiliert:

Code:
/Bahnhof.java:33: error: constructor Bahnhof in class Bahnhof cannot be applied to given types;
        Bahnhof dortmund = new Bahnhof("Dortmund", 10, 0);
                           ^
  required: Fahrt,int,String,int
  found:    String,int,int
  reason: actual and formal argument lists differ in length
/Bahnhof.java:34: error: constructor Bahnhof in class Bahnhof cannot be applied to given types;
        Bahnhof duisburg = new Bahnhof("Duisburg", 18, 19);
                           ^
  required: Fahrt,int,String,int
  found:    String,int,int
  reason: actual and formal argument lists differ in length
2 errors

Du solltest dementsprechend kontrollieren wieso die Kompilierungsfehler nicht siehst.
 
Herzlichen Dank für die Kompilierungsfehleranzeige - ich weiß nicht wieso mein IDE es nicht sieht (Intellij EDU).
Ich habe eine Lösung gefunden (zur Info für die Andere, die Lösungen hier raussuchen)
Wie es deine Fehleranzeige dargestellt wurde, der Aufruf des Object war falsch (reason: actual and formal argument lists differ in length) .
Es sollte so aussehen
Bash:
Bahnhof essen = new Bahnhof(obj1, 30, "Essen", 30);
Noch weiteres, ich habe den Try-Catch Rumpf in der berechneEntfernung Methode eingefügt. Der bricht die Schleife ab, falls der Ziel erreicht ist.
Code:
int berechneEntfernung(Bahnhof b1, Bahnhof b2){
        int entfernung = 0;
        Bahnhof curr = b1;

        while(curr != b2){
            entfernung += curr.nS.Entfernung;
            curr = curr.nS.nB;
            try{
                brecheSchreife();
            } catch (RuntimeException exp){
                break;
            }
        }

        return entfernung;
    }
 
Erst einmal schön, dass Du Dein Problem lösen konntest, aber ich habe zu dem gezeigten Code paar Anmerkungen, die hoffentlich hilfreich sind:

Also eine Exception zur Steuerung der Logik ist keine gute Idee. Wieso gibt brecheSchleife nicht einfach etwas zurück? Dann kannst du etwas haben wie if (brecheSchleife()) break;

Aber der zweite Punkt ist: wieso ist die Bedingung zur Beendigung der Schleife nicht an der entsprechenden Stelle? Du hast so mehrere Stellen, bei denen geprüft wird, ob die Schleife beendet werden soll. Das ist auch unübersichtlich.
 

Zurück
Oben