Nicht genug Eingabemöglichkeiten in der Konsole

MelMal

Neues Mitglied
Hi, hier erst mal der Code:
[CODE lang="java" title="Main"]import java.util.Scanner;
public class FranzArbeit2 {

public static void main(String[] args) {
Scanner s = new Scanner(System.in);

Verben verben = new Verben();
String av[] = verben.getAvoir();

System.out.println("Avoir konjugiert: ");

String[] avKonj = new String[6];
avKonj[0] = s.next();
avKonj[1] = s.next();
avKonj[2] = s.next();
avKonj[3] = s.next();
avKonj[4] = s.next();
avKonj[5] = s.next();

for(int i=0; i<avKonj.length; i++) {
for(int k=0; k<av.length; k++) {
if(avKonj == av[k]) {
System.out.println("Richtig");
}else {
System.out.println("Falsch");
}
}
}
}
}
[/CODE]
[CODE lang="java" title="Class Verben"]public class Verben {

private String[] avoir = {"J'ai", "Tu as", "Il/Elle/On a", "Nous avons", "Vous avez", "Ils/Elles ont"};

public Verben() {
this.avoir = avoir;
}

public String[] getAvoir() {
return avoir;
}

public void setAvoir(String[] avoir) {
this.avoir = avoir;
}
}[/CODE]
Durch diesen Code wollte ich in der Konsole das Verb avoir eingeben und mit der Lösung abgleichen. Jetzt komme ich aber bei der Eingabe nur bis zu 'Nous avons', danach wird direkt abgebrochen und 'Flasch' ausgegeben. Man kommt nicht mal dazu, fertig zu schreiben. Verstehe nicht, woran das liegt. Hat jemand eine Idee?
 
Um noch etwas auszuholen. == prueft die Objektidentitaet, also ob ob die beiden Objekte das selbe Objekt sind. Das ist bei Strings nur sehr bedingt der Fall, daher muessen diese mit equals verglichen werden, weil die Funktion prueft ob die Objekte als ident betrachtet werden koennen.

Strings sind so ein biszchen ein Sonderfall wenn es um Objekt-Identitaeten geht, weil diese durch einen globalen Cache gefuettert werden.

Java:
"ABC" == "ABC"; // true, da die beiden Strings konstant sind und daher beide Objekte aus dem Cache kommen werden zur Laufzeit.
"ABC".equals("ABC"); // true, da identer Inhalt.

String a = "ABC";
String b = "ABC";

a == b; // true, gleiches wie oben.
a.equals(b); // true, da identer Inhalt.

String a = "ABC";
String b = benutzerEingabe(); // "ABC"

a == b; // false, da "a" ein Objekt aus dem Cache ist, "b" aber ein neues String-Objekt ist.
a.equals(b); // true, da identer Inhalt.

String a = "ABC";
String b = benutzereingabe(); // "ABC"

b = b.intern(); // Laedt diesen String in den Cache (falls noch nicht vorhanden) und retourniert das Objekt aus dem Cache.

a == b; // true, da nun beide Objekte wieder aus dem Cache kommen.
a.equals(b); // true, da identer Inhalt.

Kannst du auch sehr gut mit System.identityHash nachzollziehen, weil du damit wirklich die Identitaet eines Objekts sieht.
 
Stimmt, equals hätte es sein müssen. Danke für die Erklärung. Leider kann ich immer noch nicht alle 6 Antworten eingeben. Hier mal ein Bild:
1640900798613.png
Gibt es eine Möglichkeit, wie nur ein Mal 'Richtig'/'Falsch' ausgegeben werden kann? Also ohne verschachtelte Schleife?
 
Der Ansatz ist immer gleich: überlege Dir zuerst, was du genau machen willst und Formuliere es. Das hilft, einen vernünftigen Algorithmus zu schreiben.

Wenn ein Algorithmus nicht das macht, was er soll: Debugge ihn. Oder wenn du mit dem Debugger noch nicht umgehen kannst: gib mehr Informationen aus. So kannst du ausgeben, welchen Wert du mit welchem vergleichst.

Den Fehler wirst du dann bestimmt recht schnell finden, denn der wird dann sehr schnell offensichtlich.
 
Vielleicht noch ein paar Hinweise zu deiner Klasse "Verben". Hat mit dem Problem an sich nichts zu tun, aber der Vollständigkeit halber. Möglicherweise habt ihr das Thema Datenkapselung auch noch nicht behandelt, dann ignoriere den letzten Teil zum Setter einfach.
Java:
public class Verben {

    // Hier deklarierst und initialisierst du eine Instanzvariable mit dem Namen avoir. Passt.
    private String[] avoir = {"J'ai", "Tu as", "Il/Elle/On a", "Nous avons", "Vous avez", "Ils/Elles ont"};
   
    public Verben() {
        // Hier versuchst du der Instanzvariablen this.avoir den Wert der Variablen avoir zuzuweisen.
        // Da es nur eine Variable avoir gibt, wird sie sich selbst zugewiesen.
        // Da der Konstruktor also gar nichts macht, kannst du ihn im Prizip weglassen und den
        // automatisch erzeugten parameterlosen Standardkonstruktor verwenden.
        this.avoir = avoir;
    }
   
    // Getter ist sinnvoll
    public String[] getAvoir() {
        return avoir;
    }

    // Im Sinne der objektorientierten Programmierung und der Datenkapselung, sollte man sich
    // überlegen, ob es sinnvoll ist einen Setter zu haben.
    // Die Konjugation von avoir wird sich in nächster Zeit eher nicht ändern, insofern würde
    // *ich* den Setter weglassen
    public void setAvoir(String[] avoir) {
        this.avoir = avoir;
    }  
}
 
Zuletzt bearbeitet:

Zurück
Oben