Methoden Methoden anpassen und fehlende Funktionen hinzufügen

Mika34

Bekanntes Mitglied
Ich verstehe im Moment noch nicht wie momentan die putTrain Methode genau strukturiert sein muss. Gerade fühlt es sich so an, als habe man einen Kasten aus Legosteinen und keins passt auf den Anderen genau drauf
 

mihe7

Top Contributor
Ich verstehe im Moment noch nicht wie momentan die putTrain Methode genau strukturiert sein muss. Gerade fühlt es sich so an, als habe man einen Kasten aus Legosteinen und keins passt auf den Anderen genau drauf

Also, nochmal:
Java:
    /*
    TODO:
         - Check if there is even a track at the point <point>.
         - If it is a switch at point <point> then check if it's switched to this track.
         - Check if no other train is already on the required track(s) - note the length of the train
         - Check if directionVector fits with direction of track
    */
    public void putTrain(Train train, Point point, Point directionVector) throws LogicException {
        ...
        long trainLength = train.getLength();

    }
In den TODOs stehen ja bereits die Anforderungen.

Schritt 1 besteht offensichtlich darin, das Gleis zu finden, auf dem die Lok steht. Da point sowohl zwischen den Endpunkten als auch auf den Endpunkten eines Gleises stehen kann, muss ggf. anhand der Richtung entschieden werden, welches der zwei möglichen Gleise der Richtung der Lok entspricht (horizontal/vertikal). Außerdem darf es sich gemäß Anforderung 2 nur um ein Gleis handeln, das auch angefahren wird.

Man kann also ein Schienenelement suchen, das diesen beiden Anforderungen genügt. Genau das macht findTrack.

In Anforderung 3 steht "required track(s)", wir brauchen also nicht nur das eine Gleis, auf dem die Lok steht, sondern alle Gleise, auf dem der Zug steht. Das ist Aufgabe von getRequiredTracks(), die unter anderem das Ergebnis von findTrack benötigt.

In Anforderung 4 muss nun für für alle gefunden Tracks geprüft werden, ob bereits ein Lok draufsteht. Anforderung 5 wird sowohl mit findTrack als auch mit getRequiredTracks() realisiert.

Die Methode sieht also im Wesentlichen so aus:
Java:
Track headOfTracks = findTrack(point, directionVector);
if (track == null) { throw ... } // kein passendes Gleis vorhanden

List<Track> requiredTracks = getRequiredTracks(headOfTracks, train, point, directionVector);
assertThatNoTrainIsAssigned(requiredTracks);
assignTrainToTracks(train, requiredTracks);
 

Mika34

Bekanntes Mitglied
@mihe7 Könntest du die Methode bitte zusammenbauen. Ich sitze nun seit knappen 6 Stunden daran diese Methode zum Laufen zu bekommen und es will einfach nicht funktionieren und so langsam weiß ich echt einfach nicht weiter
 

DagobertDuck

Bekanntes Mitglied
@mihe7 Stimmt der Teil aus meiner putTrain Methode denn überhaupt?
Java:
        Track headOfTracks = findTrack(point, directionVector).get();
        List<Track> requiredTracks = getRequiredTracks(headOfTracks, point, directionVector, trainLength);
        requiredTracks.forEach(required -> required.setCurrentTrain(train));
        trainsOnTrack.put(directionVector, train);
Insbesondere die letzten beiden Zeilen.
 

DagobertDuck

Bekanntes Mitglied
Macht deine assignTrainTracks(train, requiredTracks); Methode noch etwas anderes als
Java:
 requiredTracks.forEach(required -> required.setCurrentTrain(train));
trainsOnTrack.put(directionVector, train);
?
 

Mika34

Bekanntes Mitglied
Das wird sich als schwierig rausstellen, weil ich ein anderes Modell verwendet habe und nun diese Implementierung abgewandelt bei mir versuche zu implementieren. Mir fehlt der komplette Aufbau der Methode das ordentlich zu strukturieren und dabei bin ich mir noch total unsicher, ob ich nicht eine Methode vergessen habe. Orientiert an einer deiner letzten Posts würde die Methode so aussehen:
1.) mit hasConnections() prüfen, ob der Punkt überhaupt auf der Kante liegt, falls nicht Abbruch
2.) Falls der Punkt darauf liegt, dann getPassedPoint() ausführen und damit den Verbindungspunkt des Gleises. Also nur von dem Gleis, auf dem aufgesetzt wird!!!! Täsuche ich mich?????? Dies passiert in Abhängigkeit vom Richtungsvektor herausfinden.
Dann mittels getConnection() den Track bekommen auf dem der Kopf des Zuges liegt //muss man hier schon angeben, in welche Richtung der Zug bewegt wird?
3.) dann mittels getRequiredTracks() die Gleise bekommen auf welchen der Zug liegt und dann jeden Track auf den benötigten Tracks mit dem Setter setTrainOnTrack auf diese Gleise platzieren
4.) Und dann weiß ich nicht mehr weiter... Jetzt muss doch auch der Richtungsvektor ins Spiel kommen oder verraffe ich, dass dieser schon viele früher berücksichtigt werden muss?
 

Mika34

Bekanntes Mitglied
Oje, müsste in findTracks dann der Richtungsvektor implementiert werden?
Java:
    private Track findTrack(Point point) {
        for (Track track : tracks.values()) {
            if (track.canNavigateTo(point)) {
                return track;
            }
        }
        return null;
    }
 

DagobertDuck

Bekanntes Mitglied
@mihe7 In der getRequiredTracks Methode stimmt doch hiermit etwas nicht:
Java:
        while (length > 0) {
            ...
            if (!getConnection(passed, currentTrack).isPresent()) {
                throw new ...("no connection track found");
            }
            currentTrack = getConnection(passed, currentTrack).get();
        }

Wenn ich beispielsweise ein Gleis von 1,1 nach 5,1 lege und dann den Zug auf 3,1 mit Länge 1 und Richtungsvektor 1,0 aufgleisen möchte, bekomme ich den Fehler "no connection track found", was aber nicht passieren soll. Wenn ich die If-Abfrage entferne, kann es aber bei get() mit dem Optional zu Fehlern kommen.
 

DagobertDuck

Bekanntes Mitglied
Mit Hilfe des Debuggers konnte ich jetzt schon einiges verbessern. Es funktioniert sogar teilweise auch. Leider klappt es aber bei folgendem Beispielablauf (der auf jeden Fall richtig ist), noch nicht:
Code:
add track (1,1) -> (5,1)
1
add track (10,10) -> (10,11)
add switch (5,1) -> (8,1),(5,3)
2
add track (10,1) -> (8,1)
3
add switch (10,-3) -> (10,1),(12,-3)
4
add track (10,-3) -> (1,-3)
5
add track (1,-3) -> (1,1)
6
add track (5,3) -> (10,3)
7
add track (10,3) -> (12,3)
8
add switch (12,3) -> (12,-3),(14,3)
9
add track (14,-1) -> (14,3)
10
create engine steam T3 Emma 1 false true
T3-Emma
create coach passenger 1 true true
1
create coach passenger 1 true true
2
add train 1 T3-Emma
steam engine T3-Emma added to train 1
add train 1 W1
passenger coach W1 added to train 1
add train 1 W2
passenger coach W2 added to train 1
set switch 4 position (10,1)
OK
step 1
Expected error-message.
set switch 2 position (8,1)
OK
set switch 9 position (12,-3)
OK
step 1
Line 1 is missing: 'OK'
put train 1 at (1,1) in direction 1,0
Error, directions do not match
Line 1: expected 'OK', but got 'Error, directions do not match'

Ich habe den Beispielablauf fürs Debuggen mal etwas vereinfacht und der Zug hat die Länge eins, wird allerdings auf dasselbe Gleisnetz gesetzt.
Beim Debuggen ist mir folgendes aufgefallen: beim ersten Durchgang (length = 1) funktioniert die Methode einwandfrei. Jetzt wird length dekrementiert und Point passed = currentTrack.getPassedPoint(direction); wird erneut aufgerufen. Allerdings sieht der Ablauf jetzt so aus, wobei offensichtlich die Exception geworfen wird, da sich keine Koordinaten/Komponenten der Punkte/Vektoren gleichen.
Screenshot 2020-02-26 at 20.48.06.png
Mir ist nicht bewusst, wie ich das jetzt lösen soll. Eine If-Abfrage in der getRequiredTracks() Methode (?). Ich habe die Befürchtung, dass ich damit dann eher noch mehr "kaputt mache".
 

mihe7

Top Contributor
Beim Debuggen ist mir folgendes aufgefallen: beim ersten Durchgang (length = 1) funktioniert die Methode einwandfrei. Jetzt wird length dekrementiert und Point passed = currentTrack.getPassedPoint(direction); wird erneut aufgerufen.
Ach, die Länge wird falsch berechnet... Wir berechnen Distanzen zwischen Punkten, d. h. zwischen (1,1) und (1,1) ist ein Abstand von 0 und ziehen daher von der Länge 0 ab. Tatsächlich hat auf dem einen Punkt eine Lok Platz. Gleichzeitig müssen wir aufpassen, dass wir die Punkte bei Anschlussgleisen nicht doppelt zählen.

Mach mal nach der Zeile
Java:
            length -= position.distanceTo(passed);
noch ein
Java:
            if (currentTack == startTack) length--;
rein, dann dürfte es keine zweite Iteration geben.
 

Mika34

Bekanntes Mitglied
@mihe7 So langsam klappt es bei mir nun auch, jedoch habe ich noch ein Problem mit der getRequiredTracks Methode. Ich tue mich mit dem inhaltlichen Aufbau der Methode gerade schwer.
Java:
    private List<RawTrack> getRequiredTracks(RawTrack startTrack, CartesianPoint startPoint, CartesianPoint direction, int trainLength) {
        RawTrack currentTrack = startTrack;
        CartesianPoint position = startPoint;
        List<RawTrack> requiredTracks = new ArrayList<>();
        int length = trainLength;
        while (length > 0) {
            if (requiredTracks.contains(currentTrack)) {
                //Exception, da dieser schon verwendet wird
            }
            requiredTracks.add(currentTrack);
            CartesianPoint passed = currentTrack.getPassedPoint(direction);
            length = length - position.distanceTo(passed);
            position = passed;
            if (!getConnection(passed, currentTrack).isPresent()) {
                //Exception, weil kein Punkt gefunden
            }
            currentTrack = getConnection(passed, currentTrack).get();
        }
        return requiredTracks;
    }
Ist das der richtige Ansatz? Außerdem verstehe ich nicht, welche Funktionen isPresent() und get() haben und wie diese zu implementieren sind.
 

mihe7

Top Contributor
Und noch was fällt mir gerade auf: die Richtung muss sich ebenfalls ändern, da das Anschlussgleis nicht der Fahrtrichtung der Lok entsprechen muss...

Nach
Java:
currentTrack = getConnection(passed, currentTrack).get();
muss noch die richtige Richtung gesetzt werden:
Java:
direction = currentTrack.getDirectionTo(passed);
wobei currentTrack.getDirectionTo() den Richtungsvektor des Tracks in Richtung passed liefern muss.
 

mihe7

Top Contributor
Ist das der richtige Ansatz?
Ja, das entspricht meiner groben Skizze. Es geht einfach noch um Details wie z. B. die beiden Änderung von eben oder zusätzliche Abfragen wie z. B. evtl. noch erforderliche Längenprüfungen. So kann es z. B. noch notwendig sein,
Java:
            position = passed;
            if (!getConnection(passed, currentTrack).isPresent()) {
                //Exception, weil kein Punkt gefunden
            }
            currentTrack = getConnection(passed, currentTrack).get();
in einen if (length > 0)-Block zu stecken. Da müsst ihr ein wenig testen.
 

Mika34

Bekanntes Mitglied
Jetzt ist das nächste Problem da und ich verstehe nicht wo der Fehler sein soll:
Java:
    public List<RawTrack> getRequiredTracks(RawTrack startTrack, CartesianPoint startPoint, CartesianPoint direction, int trainLength) {
        RawTrack currentTrack = startTrack;
        CartesianPoint position = startPoint;
        List<RawTrack> requiredTracks = new ArrayList<>();
        int length = trainLength;
        outerloop:while (length > 0) {
            if (requiredTracks.contains(currentTrack)) {
                break outerloop;
                //Exception, da dieser schon verwendet wird
            }
            requiredTracks.add(currentTrack);
            CartesianPoint passed = currentTrack.getPassedPoint(direction);
            length = length - position.distanceTo(passed);
            position = passed;
            Terminal.printLine(edgesReadyForDriving);
            if (getConnection(passed, currentTrack).equals(currentTrack)) { //Wirft NullPointerException???
                break outerloop;

                //Exception, weil kein Punkt gefunden
            }
            currentTrack = getConnection(passed, currentTrack);
        }
        return requiredTracks;
    }
getConnection() wirft eine NullPointerException. Passed und currentTrack sind bei ungleich null. Meine Methode getConnections() ist so aufgebaut wie du es gezeigt hattest @mihe7 mit :
Java:
    private RawTrack getConnection(CartesianPoint point, RawTrack track) {
        for (RawTrack tr : edgesReadyForDriving.get(point)) {
            if (!tr.equals(track)) {
                return tr;
            }
        }
        return null;
    }
Hast du eine Idee woran es liegt, dass hier eine NullPointer geworfen wird? Die Methode muss doch falsch sein, oder nicht
 

mihe7

Top Contributor
getConnection liefert null und Du versuchst, per equals darauf zuzugreifen -> NPE (NullPointerException)

Java:
if (getConnection(passed, currentTrack) == null) {
erscheint mir sinnvoller.
 

Mika34

Bekanntes Mitglied
Aber getConnection sollte gar nicht zurückgeben wie hier z.B.
Java:
   railManager.addTrack(1, 1, 5, 1); //x1,y1,x2,y2 //track0
   railManager.addTrack(5, 1, 8, 1); //das ist track1
   CartesianPoint point1 = new CartesianPoint(6,1);
   CartesianPoint direction = new CartesianPoint(1,0);
   Terminal.printLine(railManager.getRequiredTracks(railManager.getTrack(1), point1, direction, 3));
Man gibt hier den Punkt (6,1) an, wodrauf der Zugkopf platziert werden soll. Der Zug bewegt sich nach rechts, also in Richtung (1,0). Die Länge des Zugs ist 3, also sollte requiredTracks() track0 und track1 zurückgeben, da der Zug auf beiden liegt.
Das tut es aber nicht.
Sind meine Annahmen falsch oder stimmen die Methoden vorne und hinten nicht, ausgenommen deiner Verbesserung
 

mihe7

Top Contributor
So sollte es sein. Gehen wir die Methode mal durch:

currentTrack = track1 (5,1,8,1), position = point1 (6,1)
while-Schleife: length == 3 > 0, also wird der Schleifenrumpf ausgeführt.
requiredTracks enthält currentTrack nicht -> requiredTracks = {(5,1,8,1)}
passed = (5,1)
length = length - position.distanceTo(passed) = length - 1 = 2
currentTack = getConnection((5,1), currentTrack) = (1,1,5,1)
position = (5,1)

while: length == 2 > 0, also wird der Schleifenrumpf ausgeführt
requiredTracks enthält currentTrack (1,1,5,1) nicht -> requiredTracks = {(5,1,8,1), (1,1,5,1)}
passed = (1,1)
length = length - position.distanceTo(passed) = length - 4 = -2
getConnection(passed, currentTrack) liefert null -> Fehler

Jetzt verstehst Du ggf. auch Kommentar #172.
 

Mika34

Bekanntes Mitglied
Vielen Dank @mihe7 , verstanden habe ich wie es nun zustande kommt, jedoch bekomme ich als return nicht requiredTracks = {(5,1,8,1), (1,1,5,1)}, sondern nur [t 2 (5,1) -> (8,1) 3], also track1.
In diesem Fall wird track0 quasi nicht beachtet. Liegt es daran, dass der Wert der Liste überschrieben wird oder weißt du woran das liegen könnte?
 

DagobertDuck

Bekanntes Mitglied
@mihe7 Vielen Dank für die Hilfe so weit. Leider bekomme ich bei Mikas Ablauf eine ganz andere Fehlermeldung:
add track (1,1) -> (5,1) add track (5,1) -> (8,1) put train 1 at (6,1) in direction 1,0 (Zug der Länge 3) Error, train cannot be positioned

Java:
    private List<Track> getRequiredTracks(Track startTrack, Point startPoint, Point direction, long trainLength) {
        Track currentTrack = startTrack;
        Point position = startPoint;
        List<Track> requiredTracks = new ArrayList<>();
        long length = trainLength;
        Point dir = direction;
        while (length > 0) {
            if (currentTrack == null || requiredTracks.contains(currentTrack)) {
                throw new ...("train cannot be positioned");
            }
            requiredTracks.add(currentTrack);
            Point passed = currentTrack.getPassedPoint(dir);
            length -= position.distanceTo(passed);
            if (currentTrack == startTrack) {
                length--;
            }
            position = passed;
            if (getConnection(passed, currentTrack) == null) {
                // Throw exception
            }
            currentTrack = getConnection(passed, currentTrack);
            dir = currentTrack.getDirectionTo(passed);
        }
        // Wird i. d. F. gar nicht erst ausgeführt
        Terminal.printLine(requiredTracks);
        return requiredTracks;
    }

Ich denke mal, dass dies wieder mit einer falschen Iterationsanzahl zu tun hat. Es wird doch currentTrack zu requiredTracks hinzugefügt und in der nächsten Iteration geschaut, ob currentTrack in requiredTracks enthalten ist -> Exception. Was ist hier falsch...? Debuggen hat mich leider nicht wirklich weiter gebracht

Btw: Habe ich die Richtung dir korrekt eingebaut?
 

mihe7

Top Contributor
Es wird doch currentTrack zu requiredTracks hinzugefügt und in der nächsten Iteration geschaut, ob currentTrack in requiredTracks enthalten ist -> Exception. Was ist hier falsch...?
Wenn das erst in der zweiten Iteration passiert, dann musst Du Dir die erste anschauen: dort wird geprüft, ob getConnection() null liefert, falls ja -> Exception.

Demnach kann in der zweiten Iteration currentTrack nicht null sein (außer getConnection liefert bei jedem Aufruf mit gleichen Parametern etwas anderes zurück). Also kann nur requiredTracks.contains(currentTrack) true liefern, was wiederum der Fall ist, wenn in der vorherigen Iteration getConnection() currentTrack liefert.

Sollte nicht passieren:
Java:
    private Track getConnection(Point point, Track track) {
        for (Track tr : edges.get(point)) {
            if (!tr.equals(track)) {
                return tr;
            }
        }
        return null;
    }

Es hilft nur der Debugger. Breakpoint setzen, Variablen genau anschauen, Schritt für Schritt durchgehen. Du weißt ja, was in jedem Schritt erwartet wird. Irgendwo weicht das davon ab.
 

DagobertDuck

Bekanntes Mitglied
OK, die Fehlermeldung Error, train cannot be positioned lag an:
Java:
Point dir = direction;
...
dir = currentTrack.getDirectionTo(passed);
(siehe Code von oben)

Und noch was fällt mir gerade auf: die Richtung muss sich ebenfalls ändern, da das Anschlussgleis nicht der Fahrtrichtung der Lok entsprechen muss...

Nach
Java:
currentTrack = getConnection(passed, currentTrack).get();
muss noch die richtige Richtung gesetzt werden:
Java:
direction = currentTrack.getDirectionTo(passed);
wobei currentTrack.getDirectionTo() den Richtungsvektor des Tracks in Richtung passed liefern muss.
Den Teil habe ich vorerst entfernt. Ist etwas falsch daran? Eventuell habe ich es falsch umgesetzt.
Nichtsdestotrotz bekomme ich jetzt den Fehler:
Error, no connection track found
Java:
            if (getConnection(passed, currentTrack) == null) {
                throw new ...("no connection track found");
            }

Bei der zweiten Iteration:
Screenshot 2020-02-27 at 12.24.50.png
Leider kann ich das nicht richtig nachvollziehen. Wo liegt hier der Fehler...? Und muss das mit der Richtung wieder rein?
 

DagobertDuck

Bekanntes Mitglied
Java:
    public Point getDirectionTo(Point vector) {
        return new Point((int) Math.signum(vector.getFirstComponent()), (int) Math.signum(vector.getSecondComponent()));
    }
 

mihe7

Top Contributor
dir = currentTrack != null ? currentTrack.getDirectionTo(passed) : null;
currentTrack kann an der Stelle nicht null sein, den check kannst Du Dir sparen.

Die Methode getDirectionTo ist falsch implementiert. Wenn der passed gleich switchedTo ist, dann fährt der Zug von startPoint Richtung switchedTo, sonst von switchedTo to startPoint.
 

mihe7

Top Contributor
In der Methode requiredTracks(), denn getDirectionTo() normiert den Vektor doch nur?
Ich dachte, toDirection() gibt den normierten Vektor zurück... Dem entsprechend hätte nun Track#getDirectionTo den (normierten) Richtungsvektor des Tracks angegeben, wenn zum angegebenen Endpunkt gefahren wird. Wenn dir Methode getDirectionTo schon existiert, dann muss die hier natürlich umbenannt werden.

EDIT: evtl. wäre getDrivingDirection ein besserer Name.
 

Mika34

Bekanntes Mitglied
Tut mir leid, ja es gibt den normierten Richtungsvektor zurück. Track#getDirectionTo gibt dann auch einen normierten Richtungsvektor zurück in Richtung Start oder Ende des Gleises, je nachdem wohin der normierte Richtungsvektor zeigt, welcher vom Nutzer eingegeben wird.
Habe ich das richtig verstanden?
 

mihe7

Top Contributor
Ja, wobei eben der übergebene Punkt eine Rolle spielt.

Beispiel: Track (1,1,5,1), also ist die Richtung des Tracks (1,0) - soweit, so gut. Der Zug kann aber das Gleis in beiden Richtungen befahren. Demnach muss getDirectionTo(5,1) gibt (1,0), getDirectionTo(1,1) gibt (-1,0) zurückgeben.
 

Mika34

Bekanntes Mitglied
Also spielt in diesem Fall der Richtungsvektor in dem der Zug fährt (drivingDirection) in diesem Fall keine Rolle. So würde der Code dann aussehen mit der einzigen Abänderung bei getDirection:
Java:
    private List<RawTrack> getRequiredTracks(RawTrack startTrack, CartesianPoint startPoint, CartesianPoint direction, long trainLength) {
        RawTrack currentTrack = startTrack;
        CartesianPoint position = startPoint;
        List<RawTrack> requiredTracks = new ArrayList<>();
        long length = trainLength;
        CartesianPoint dir = direction;
        while (length > 0) {
            if (currentTrack == null || requiredTracks.contains(currentTrack)) {
             //   throw new ...("train cannot be positioned");
            }
            requiredTracks.add(currentTrack);
            CartesianPoint passed = currentTrack.getPassedPoint(dir);
            length -= position.distanceTo(passed);
            if (currentTrack == startTrack) {
                length--;
            }
            position = passed;
            if (getConnection(passed, currentTrack) == null) {
                // Throw exception
            }
            currentTrack = getConnection(passed, currentTrack);
            // Bestimmt die Richtung in den der Zug gelegt wird mittels dem passedPoint
            dir = currentTrack.getDirectionTo(passed);
            }
            }
 

mihe7

Top Contributor
Also spielt in diesem Fall der Richtungsvektor in dem der Zug fährt (drivingDirection) in diesem Fall keine Rolle
Der ist ja das Problem :) Fahr mal um eine Kurve, dann fährt die Lok z. B. nach rechts, während die Waggons noch nach oben fahren. getDirectionTo liefert sozusagen die Fahrtrichtung der Waggons auf dem Gleis.
 

Mika34

Bekanntes Mitglied
Aber hier geht es noch um das Legen und das will gar nicht funktionieren. Die drivingDirection lässt sich wie folgt normiert holen:
Java:
    //Normieren vom Fahrtektor
    public CartesianPoint getDrivingDirectionNormed(int x, int y) {
        return new CartesianPoint((int)Math.signum(x), (int)Math.signum(y));
    }
Jetzt fehlt nur noch der Richtungsvektor der Gleise in welchen der Zug als Gesamtheit fährt. Der Aufbau ist doch ähnlich wie von getDrivingDirectionNormed() oder nicht? Ich bekomme es einfach nicht auf die Kette
 

Mika34

Bekanntes Mitglied
Und mir fällt auf, dass die
Code:
    private Track getConnection(Point point, Track track) {
        for (Track tr : edges.get(point)) {
            if (!tr.equals(track)) {
                return tr;
            }
        }
        return null;
    }
nicht sauber funktioniert. Die Methode gibt das aktuelle Gleis aus und nicht das, welches sich am Anschlusspunkt befindet. Das könnte die Ursache für die NPE u.U. sein
 

DagobertDuck

Bekanntes Mitglied
Dem entsprechend hätte nun Track#getDirectionTo den (normierten) Richtungsvektor des Tracks angegeben, wenn zum angegebenen Endpunkt gefahren wird
Java:
public Point getDirectionTo(Point passed) {

    if (passed == switchedTo) {


    } else {

    }

}

Wie sähe die Methode dann konkret aus?

currentTrack kann an der Stelle nicht null sein, den check kannst Du Dir sparen.
Warum zeigt mir meine IDE dann fälschlicherweise "Method invocation 'getDrivingDirection' may produce 'NullPointerException'" an?
 

Mika34

Bekanntes Mitglied
@mihe7 Die putTrain Methode klappt bei mir nun fast komplett. Muss diese nur noch zusammenstellen und die Exceptions werfen. Gott sei Dank.
Nun komme ich zum Fahren und ich muss sagen das dies mir die größten Kopfschmerzen bereitet.
Mein Ansatz ist es den putTrain Befehl für jedes Fahren erneut auszuführen unter der Bestimmung der Punkte wo der Zug aufgegleist wird.
Ist das Mode oder kann das weg?
 

mihe7

Top Contributor
Warum zeigt mir meine IDE dann fälschlicherweise "Method invocation 'getDrivingDirection' may produce 'NullPointerException'" an?
Das ist nicht fälschlicherweise, sondern ein Hinweis der IDE. Wenn Du z. B. null übergibst, bekommst Du eine NPE, wenn die Methode null zurückliefert, bekommst Du wg. equals eine NPE.

Tatsächlich kann das aber aufgrund des Ablaufs der Methode nicht auftreten: currentTrack kann nicht null sein, weil das ein paar Zeilen vorher abgefangen wird.
 

DagobertDuck

Bekanntes Mitglied
Danke, das habe ich mir schon gedacht. Ich habe allerdings die Erfahrung gemacht, dass meine IDE den Verlauf der Methode dabei beachtet. Deswegen war ich etwas verwundert. Könntest du mir kurz zeigen, wie die getDirectionTo Methode auszusehen hat?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Methoden methoden an generischen klassentyp anpassen Allgemeine Java-Themen 5
D Interface, aber die Methoden bleiben teilweise gleich Allgemeine Java-Themen 35
B Leere vererbte Interface-Methoden Allgemeine Java-Themen 8
R Programm führt Methoden gleichzeitig aus Allgemeine Java-Themen 2
Encera Unterschied zweier "toString"-Methoden Allgemeine Java-Themen 1
torresbig Klasse mit extends Calendar über Methoden ändern (Hirnblockade) Allgemeine Java-Themen 7
Sachinbhatt Sind alle Methoden in Java implizit virtuell Allgemeine Java-Themen 2
B Arrays von Methoden möglich? Allgemeine Java-Themen 44
S Mit Methoden kann man definieren für was <T> steht. Geht das auch irgendwie für Variablen? Allgemeine Java-Themen 12
N abstracte klassen methoden Allgemeine Java-Themen 32
G Methoden für die Zukunft sinnvoll? Allgemeine Java-Themen 4
nonickatall Methoden Kann man Klassen/Methoden aus Variablen heraus aufrufen? Allgemeine Java-Themen 6
LimDul Hä? Lambda-Ausdruck geht, Methoden-Referenz nicht Allgemeine Java-Themen 8
B Methoden Java Getter und Setter Methoden Allgemeine Java-Themen 9
Y Java Methoden unterschiedliche Zahlenreihen Allgemeine Java-Themen 2
S Interface Design von HookUp oder Callback Methoden für eigenes Framework Allgemeine Java-Themen 9
F Sich automatisch aufrufende Java-Methoden Allgemeine Java-Themen 2
J Namen von Methoden über Reguläre Ausdrücke bearbeiten Allgemeine Java-Themen 6
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
R Statistische Methoden (Mathematik) Aufgabe Allgemeine Java-Themen 9
X Brüche kürzen mittels Methoden und ggT Allgemeine Java-Themen 15
L Operatoren Java Reflections: Alle Methoden einer Klasse aufrufen ohne Exceptions Allgemeine Java-Themen 5
L mehrere Methoden Allgemeine Java-Themen 19
KeexZDeveoper Zugriff auf Methoden vom Server Allgemeine Java-Themen 7
B StAX Parser - mehrere Methoden, ein XML Allgemeine Java-Themen 4
F Operationen/Methoden einen WebService im Browser mit Apache Axis aufrufen Allgemeine Java-Themen 4
A Automatisches Methoden Laufzeiten logging? Allgemeine Java-Themen 7
M Quellcode von Java-Methoden Allgemeine Java-Themen 9
rentasad Design-Frage - Interfaces, Klassen, statische Methoden Allgemeine Java-Themen 3
N HashMap und Methoden richtig einbinden Allgemeine Java-Themen 2
R Variable durch mehrere Methoden ändern und nutzen Allgemeine Java-Themen 17
Q-bert Methoden Methoden in Java Allgemeine Java-Themen 13
D Methoden Java-Aufgabe Allgemeine Java-Themen 2
M Compiler-Fehler Methoden-Referenz Allgemeine Java-Themen 5
X Threads Externe Variablen in Run Methoden verändern Allgemeine Java-Themen 4
S 2 methoden mit gleichen namen und ein Interface Allgemeine Java-Themen 9
F Enum-werte als Methoden-Parameter übergeben Allgemeine Java-Themen 6
N Vererbung Design-Problem mit vorhandenen, von der Klasse unabhängigen Methoden Allgemeine Java-Themen 12
E OOP Objekte und Methoden Allgemeine Java-Themen 1
K Java ruft Methoden nicht der Reihe nach auf Allgemeine Java-Themen 14
N Methoden Methoden einer Klasse auf Grundlage eines Strings aufrufen Allgemeine Java-Themen 6
T Java Array in Methoden Allgemeine Java-Themen 1
D Code für bereitgestellte Methoden Allgemeine Java-Themen 1
P Entity Objekt Methoden vs Service methoden Allgemeine Java-Themen 2
R Signatur von Methoden in eine Datei schreiben? Allgemeine Java-Themen 4
A Methoden verändern Allgemeine Java-Themen 12
F Methoden Arraylist weiterverwenden nach methoden Aufruf Allgemeine Java-Themen 2
J Best Practice Testen von protected Methoden Allgemeine Java-Themen 7
L Methoden "Schiffe versenken" Quellcode in Methoden umwandeln Allgemeine Java-Themen 6
G Matrix reduzieren zwei Methoden Allgemeine Java-Themen 2
Sogomn Best Practice "Doppelte" Methoden Allgemeine Java-Themen 3
Paul15 String Methoden Allgemeine Java-Themen 7
G Methoden BMI -Wert Aufgabe(Methoden) Allgemeine Java-Themen 4
F Testen von Methoden Allgemeine Java-Themen 3
S "Vererben" statischer Felder/Methoden Allgemeine Java-Themen 4
F Methoden in der Enumeration Klasse Allgemeine Java-Themen 1
S Methoden ohne Methodenkopf ?! Allgemeine Java-Themen 5
T Überschreiben von Methoden Allgemeine Java-Themen 6
M Methoden werden in falscher Reihenfolge bearbeitet Allgemeine Java-Themen 10
S Methoden Methoden überschreiben Allgemeine Java-Themen 3
N Threads statische Methoden in Threads Allgemeine Java-Themen 5
O Java-Obfuscator, welcher einzelne Methoden, Klassen und Ordnerstrukturen ausnehmen kann. Allgemeine Java-Themen 1
A also definition von klassen und string methoden und algorithmik Allgemeine Java-Themen 13
X Eigene Annotation - mit Bedingung für ganze Klassen oder Methoden Allgemeine Java-Themen 2
A Threads Lock über mehrere Abschnitte in verschiedenen Methoden Allgemeine Java-Themen 5
S Methoden Frage Allgemeine Java-Themen 2
R Wie kann man diese Methoden in arrays etablieren? Allgemeine Java-Themen 8
M Methoden in Rescources speichern Allgemeine Java-Themen 4
G Synchronisation nicht statischer Methoden Allgemeine Java-Themen 4
A Vererbung finale Methoden überschreiben Allgemeine Java-Themen 24
A Methoden parallelisieren? Allgemeine Java-Themen 2
C Methoden Übernahme von standart nativen Methoden? Allgemeine Java-Themen 9
B Zusammenfassen verschiedener ähnlicher Methoden Allgemeine Java-Themen 8
K JNI: Methoden aus unterschiedlichen Threads aufrufen Allgemeine Java-Themen 3
P Unterschiedliche Clone- Methoden Allgemeine Java-Themen 5
MQue Spezialfrage Überschreiben von Methoden Allgemeine Java-Themen 14
B Methoden Alle Methoden und Variablen aus Java-Dateien auslesen. Allgemeine Java-Themen 7
MiMa Rekursive Methoden Allgemeine Java-Themen 3
S Programm das alle aufgerufenen Methoden ausgibt..? Allgemeine Java-Themen 6
F ListIterator (next & previous methoden) Allgemeine Java-Themen 5
W Frage zu Refactoring statischer Methoden Allgemeine Java-Themen 4
M Methoden/Klassen für andere Projekte Allgemeine Java-Themen 4
T Methoden per String-Namen aufrufen Allgemeine Java-Themen 2
C Kapselung Warum graift man auf Variablen nur über Methoden und nich direkt zu? Allgemeine Java-Themen 10
M Methoden Static Methoden und Thread??? Allgemeine Java-Themen 4
A Methoden ohne Referenzen finden Allgemeine Java-Themen 9
turmaline OOP zwei gleiche Methoden mit kleinen Unterschieden Allgemeine Java-Themen 15
G JUnit Test Methoden in anderen Thread verlagern Allgemeine Java-Themen 4
K Auf Methoden der Runnable Klasse zugreifen Allgemeine Java-Themen 2
S Methoden Class.forName() >> Methoden - Reihenfolge Allgemeine Java-Themen 5
D Passende Name für Methoden finden Allgemeine Java-Themen 3
D Wann sollte ich statische Methoden und Variablen benutzen? Allgemeine Java-Themen 44
A Methoden laufen im Konstruktor, außerhalb allerdings nicht Allgemeine Java-Themen 2
M Generische Methoden mit Java und globale Variablen Allgemeine Java-Themen 9
GianaSisters ArrayList in Methoden übergeben Allgemeine Java-Themen 3
S static methoden Allgemeine Java-Themen 9
J coole Methoden Allgemeine Java-Themen 6
R Methoden in einem Thread unterschiedlich oft ausführen Allgemeine Java-Themen 4
A OOP: Überschreiben/Implementierung von Methoden Allgemeine Java-Themen 5
P Methoden und Werte Allgemeine Java-Themen 17

Ähnliche Java Themen


Oben