Frage von Tischtennisftw, 47

Wieso funktioniert der Java-Code nicht?

Hey ich habe zu einem DEA den Java Code versucht zu schreiben. Der DEA ist im zweiten Bild gezeigt und es kommen binäre Zahlen heraus, die durch zwei teilbar sind. Nun habe ich einen kleinen Code geschrieben und extra einen Fehler eingebaut (Ist auch im Bild markiert).Als Beispiel habe ich zuerst eine 1 und dann eine 0 eingegeben. Dann würde er ja vom Startzustand erstmal zu B übergehen und dann halt zu A dem Endzustand. Dann könnte er ja auch ausgeben "Ist durch zwei teilbar" habe aber extra das true in ein false geändert um zu gucken was passiert. Allerdings wird nun trotzdem "Ist durch 2 teilbar ausgegeben". Da mein Java-Können praktisch gegen 0 geht und ich nicht weiter weiß nach langem Probieren wäre es echt super freundlich, wenn mir jemand auf die Sprünge helfen könnte.

Danke schon mal :)

Antwort
von oelbart, 21

Mit `zustand = "S"' legst Du ein String-Objekt mit dem Inhalt "S" als Konstante im Speicher an und Deine Variable 'zustand` erhält die Adresse von diesem Objekt. Wenn Du schreibst
if(Zustand == "S")
legt er ein ANDERES String-Objekt mit dem Inhalt "S" an und vergleicht dessen Adresse mit dem, was in 'zustand` steht.

Aus diesem Grund vergleicht man Strings nicht mittels ==, sondern mittels zustand.equals("S")

Eleganter wäre es allerdings, den Zustand über andere Variablen (zb int oder char) abzuspeichern, dann kann man es auch so machen wie Du.

Dazu noch ein kleiner Formtipp: Wenn Du oben Deine drei Zustände als Konstanten ablegst (also const char STARTZUSTAND = 's') und unten im Code dann mit diesen arbeitest, wird der Code noch einmal deutlich lesbarer.

Im übrigen möchte ich nochmal darauf hinweisen, dass mir die Zweideutigkeit von "String anlegen" durchaus bewusst ist.

Antwort
von Jonas711, 33

Hab gerade nur ganz grob draufgeschaut und schon mal drei Sachen gesehen:

  • String vergleichen mit string1.equals(string2)
  • Wenn du scanner aufrufst, wird da bei jedem Aufruf der Zustand auf S gesetzt. Wenn du das dauerhaft speichern willst, kann die Variable nicht so in der Methode deklariert werden.
  • Die Verwendung einer while-Schleife erschließt sich mir gerade überhaupt nicht. Du brichst ja immer nach einem Durchlauf ab. Also if... else if oder switch... case
Kommentar von Tischtennisftw ,

Auf jeden Fall schon mal danke. Ja die while-Schleifen waren ein bisschen unnötig, aber mit den If Bedingungen hatte es auch nicht geklappt und ich dachte mir, dass es wenn ich bei gutefragennet frage sowieso egal ist. Mit equals werde ich gleich mal probieren. Hab dann aber noch ne Frage, falls das kein Aufwand ist. Wo würdest du dann die Variable deklarieren, weil beim ersten Durchlauf der Zustand "S" auf jeden Fall gegeben sein muss?

Kommentar von oelbart ,

Klassischerweise würde man das dann nicht statisch machen, sondern eine Klasse "Zustandsautomat" schreiben, die als Variable S besitzt. Im Konstruktor wird der dann auf 'S' gesetzt.

Kommentar von Tischtennisftw ,

Sorry, könntest du das vielleicht nochmal etwas erläutern. Das einzige Problem, weshalb es nicht läuft ist doch eigentlich nur, weil zustand immer wieder auf das selbe gesetzt wird beim Audruf von scanner. Wie kann ich das jetzt so machen, dass die Variable eventuell beim Programmstart einmal erzeugt wird und scanner() dann damit arbeiten kann :D Tut mir echt leid

Keine passende Antwort gefunden?

Fragen Sie die Community