Switch Schleife - orphaned case

lulas[]args

Mitglied
hey!
ich hab ein kleines Programm geschrieben dass mir ein Menü anzeigen soll, mit dessen hilfe ich wählen will ob Mensch gegen Computer etc. spielen soll. leider bekomme ich bei meinem while aufruf (Z.12) den Fehler "empty statement after while" und "orphanend case" bei case 2-4 angezeigt. Ist es nicht möglich die Objekte als Fallunterscheidung zu erzeugen? ???:L

mfg lulas

[Java]
public static void main(String[] args) {
System.out.println("Spiel gestartet");
System.out.println();

Spielbrett sb = new Spielbrett();

boolean fertig = false;
// Starte das Programm mit einem Spielmenü
System.out.println("======================");
System.out.println("======Spielmenü=======");
System.out.println("======================");
//Schleifenbeginn
while (!fertig) {
//Menü
System.out.println();
System.out.println("1: Mensch vs. Mensch");
System.out.println("2: Mensch vs. Computer");
System.out.println("3: Computer vs. Computer");
System.out.println("4: Spiel beenden");
System.out.println();
System.out.println("Bitte Wählen und Enter drücken.");
int auswahl = new java.util.Scanner(System.in).nextInt();
//Fallunterscheidung
switch (auswahl) {
case 1: // Mensch vs. Mensch
Spieler s1 = new Mensch();
Spieler s2 = new Mensch();

if (s2.name.equals(s1.name)) {
do {

System.out.println("Gleicher Name geht nicht! Bitte anderen Namen nennen:");
Mensch.spielerAnzahl = 2;
s2 = new Mensch();
} while (s2.name.equals(s1.name));
break;


case 2: // Mensch vs. Computer
Spieler s1 = new Mensch();
Spieler s2 = new Computer();

if(s2.name.equals(s1.name)){
do{

System.out.println("Gleicher Name geht nicht! Bitte anderen Namen nennen:");
Mensch.spielerAnzahl = 2;
s2 = new Computer();
}while(s2.name.equals(s1.name));
break;
case 3: // Computer vs. Computer
Spieler s1 = new Computer();
Spieler s2 = new Computer();

if(s2.name.equals(s1.name)){
do{

System.out.println("Gleicher Name geht nicht! Bitte anderen Namen nennen:");
Mensch.spielerAnzahl = 2;
s2 = new Computer();
}while(s2.name.equals(s1.name));
break;
case 4: // Programm beenden
fertig=true;
break;
default://Falsche Zahl eingegeben
System.out.println("Eingabefehler!");
}
}
}
[/Java]
 
Zuletzt bearbeitet:
Semikolon 😱, oke bin echt noch neu 😉, aber wie ist das mit dem orphaned case? oda was sagt mir das allgemein. wenn ich mein Programm laufen lasse funktioniert nur case 1 bei den anderen werde ich nur wieda aufgefordert ne zahl einzugeben aba er setzt die Spieler nicht entsprechen 🙁
danke schonmal!
 
Nutzt du Eclipse? Tu uns mal bitte den Gefallen und drück STRG+SHIFT+F. So kann man den Code nicht ordentlich lesen, und bei deiner eh schon sehr strangen Logik mit lauter Schleifen und switch-Konstrukten ist es sehr schwer da den Logikfehler zu sehen. Falls du keine IDE nutzt: Bitte formatier den Code per Hand, und rück alles ordentlich ein.
 
In Zeile 31 (
Code:
if (s2.name.equals(s1.name)) {
) wird die öffnende, geschweifte Klammer viel zu weit unten geschlossen. Ich nehme an, du solltests sie vor dem
Code:
case 2:
schließen.
 
Zuletzt bearbeitet:
Java:
 case 1: // Mensch vs. Mensch
        Spieler s1 = new Mensch();
        Spieler s2 = new Mensch();
                
        if(s2.name.equals(s1.name)){ 
            do{ 
        
            System.out.println("Gleicher Name geht nicht! Bitte anderen Namen nennen:");    
            Mensch.spielerAnzahl = 2;
            s2 = new Mensch();
        }while(s2.name.equals(s1.name));

Wo genau wird denn dein Name überhauot gesetzt? Hab ich das nur übersehen oder steht das nirgends (überdies sollte man auch nicht direkt an die Variable name rankommen, sondern nur über getter/setter). Jedenfalls dürftest du an der Stelle in einer Endlosschleife hängen, da s1 und s2 IMMER den selben Namen haben (null, also nicht definiert).

EDIT: Außerdem fehlt hier scheinbar eine Klammer...
 
Jedenfalls dürftest du an der Stelle in einer Endlosschleife hängen, da s1 und s2 IMMER den selben Namen haben (null, also nicht definiert).
Das kann nicht sein. Denn wenn die null wären dann würde es keine Endlosschleife geben sondern eine NullPointerException:

s2.name.equals(...)
 
Das kann nicht sein. Denn wenn die null wären dann würde es keine Endlosschleife geben sondern eine NullPointerException:
Auch wieder wahr... aber eigtl. müssten sie standardmäßig doch null sein (jedenfalls wenn man hdi´s Video über Instanzinitialisierung oder wie das hieß glauben darf 😀)

EDIT: Willst du den Namen nicht auch irgendwo einlesen?
 
Zuletzt bearbeitet:
Du darfst nicht implizieren dass mit new Mensch() der Default-Konstruktor aufgerufen wird. Er kann auch einen eigenen paremterlosen Konstruktor geschrieben haben, der name halt irgendwas zuweist.
 
Du darfst nicht implizieren dass mit new Mensch() der Default-Konstruktor aufgerufen wird. Er kann auch einen eigenen paremterlosen Konstruktor geschrieben haben, der name halt irgendwas zuweist.
Wenn er das gemacht hat, dann aber sowhol mit Mensch1 als auch Mensch2, was bedeuetet, dass beide Namen gleich sein müssten...
 
Bevor ich mich hier unbeliebt mache, wie muss ich das Kommando Strg+Shift+F verwenden? Hier beim Einfügen oder in der IDE? :noe: Ich benutze zur Zeit Neatbeans, weil ich dass Gefühl habe, dass es einem Anfänger mehr entgegenkommt.

Der Name wird über die Tastatur in der Klasse Mensch eingelesen, beim Computer wird er einfach gesetzt. Ausprobiert hab ich das hin und her schalten ohne die Schleife, also nur über die Objekterzeugung, die ich jetzt jeweils als cases eingebaut habe. Als ich direkt Mensch oder Computer eingegeben per Hand variiert habe, ist es gelaufen.
 
Es sei denn der Name wird an Hand eines bestimmten Faktors ermittelt, der sich zwischen dem Zeitpunkt des ersten und zweiten Konstruktoraufrufs ändert. Aber, das glaub ich jetzt mal nicht 😀 Und damit wären wir wieder bei deiner Vermutung: Endlosschleife.

edit: Okay scheinbar doch.. Das ist kein gutes Design! Nimm das Einlesen aus dem Konstruktor vom Mensch raus, und führ das extern aus. Also:

Java:
String name = // read name from console
Mensch m1 = new Mensch(name);

Merke: Ein Konstruktor/Methode sollte niemals etwas tun, was aus Sicht des Callers nicht transparent ist.

Aber wie schon gesagt, solange der TO den Code nicht ordentlich formatiert habe zumindest ich persönlich keine Lust das zu debuggen.
 
Zuletzt bearbeitet:
wie muss ich das Kommando Strg+Shift+F verwenden? Hier beim Einfügen oder in der IDE?
In der IDE. Bei Eclipse ist es STRG+SHIFT+F. Bei Netbeans weiß ich nicht. Aber kuck mal in die Menüs von Netbeans oben, da gibt's irgendwo ein Punkt zum Formatieren des Codes.
 
mach ich beim einfügen des codes vllt was falsch, weil ich hab ihn jetzt formatiert, aber es geht immer noch nicht.
die Sache mit der Endlosschleife die beim Einlesen verursacht wird, würde die nicht auch auftreten, wenn ich keine Fallunterscheidung machen würde, sondern jeweils nur eine Spielart zulassen würde? Ich seh ein, dass die Modellierung einige schwächen hat, aber ich tue mir mit meinen paar wochen java erfahrung echt schwer über die Grunddinge rauszugehn, da ich vieles nich kenn. Sollte man von Anfang an getters und setters verwenden oder kann man die auch einfügen, wenn man die Grundproblematik modelliert hat? danke!
mfg lulas
 
Zuletzt bearbeitet:
mach ich beim einfügen des codes vllt was falsch, weil ich hab ihn jetzt formatiert aber es geht immer noch nicht.
Ist er denn in der IDE nun richtig eingerückt? Ich wüsste jetzt nicht was man beim Reinkopieren von dem Code hier ins Forum falsch machen könnte 😀

die Sache mit der Endlosschleife die beim Einlesen verursacht wird, würde die nicht auch auftretten wenn ich keine Fallunterscheidung machen würde, sondern jeweils nur eine Spielart zulassen würde?
Kann ich erst sagen wenn ich den Code lesen kann -> Formiertierung

ich seh ein, dass die Modellierung einige schwächen hat, aber ich tue mir mit meinen paar wochen java erfahrung echt schwer über die Grunddinge rauszugehn, da ich vieles nich kenn.
Kein Ding, war ja kein Vorwurf sondern ein Tipp

Sollte man von Anfang an getters und setters verwenden oder kann man die auch einfügen wenn man die Grundproblematik modelliert hat? danke!
Von Anfang an verwenden!

PS: Ich mach für heut Schluss. Vllt hast du es bis morgen hinbekommen den Code zu formatieren :bae:
 
Du solltest dich so früh wie möglich an getter und setter gewöhnen, wenn du´s nicht tust, gewöhnst du dir schnell an, alle Varaiblen public zu machen, wodurch sie überall angreifbar und veränderbar werden. Das hat zur Verfolge, dass du absolut keine Möglichkeit mehr hast, die Zugriffe auf deine Eigenschaften zu reglemenieren oder zu überprüfen.
 
Java:
   public static void main(String[] args) 

 {
       System.out.println("Spiel gestartet");
       System.out.println();

          Spielbrett sb = new Spielbrett();

          boolean fertig = false;
          // Starte das Programm mit einem Spielmenü
          System.out.println("======================");
          System.out.println("======Spielmenü=======");
          System.out.println("======================");

            //Schleifenbeginn
            while (!fertig) 
    {

                //Menü
                System.out.println();
                System.out.println("1: Mensch vs. Mensch");
                System.out.println("2: Mensch vs. Computer");
                System.out.println("3: Computer vs. Computer");
                System.out.println("4: Spiel beenden");
                System.out.println();
                System.out.println("Bitte Wählen und Enter drücken.");
                int auswahl = new java.util.Scanner(System.in).nextInt();

                   //Fallunterscheidung
                   switch (auswahl) 
          {
                          case 1: // Mensch vs. Mensch
                                   Spieler s1 = new Mensch();
                                   Spieler s2 = new Mensch();

                                   if (s2.name.equals(s1.name))   {
                                        do   {

                                          System.out.println("Gleicher Name geht nicht! Bitte anderen Namen");
                                          Mensch.spielerAnzahl = 2;
                                          s2 = new Mensch();
                                   } 
                                            while (s2.name.equals(s1.name));
                                            break;

                    
                         case 2: // Mensch vs. Computer
                                  Spieler s1 = new Mensch();
		        Spieler s2 = new Computer();
                
                                  if(s2.name.equals(s1.name))  { 
                                       do  { 
		
		                System.out.println("Gleicher Name geht nicht! Bitte anderen Namen");	
		                Mensch.spielerAnzahl = 2;
		                s2 = new Computer();
		         }
                                            while(s2.name.equals(s1.name));
                                            break;

                         case 3: // Computer vs. Computer
                                  Spieler s1 = new Computer();
		        Spieler s2 = new Computer();
                
                                  if(s2.name.equals(s1.name))  { 
		             do  { 
		
		                 System.out.println("Gleicher Name geht nicht! Bitte anderen Namen");	
		                 Mensch.spielerAnzahl = 2;
		                 s2 = new Computer();
		        }
                                            while(s2.name.equals(s1.name));
                                            break;

                        case 4: // Programm beenden
                                 fertig=true;
                                            break;

                        default://Falsche Zahl eingegeben
                                   System.out.println("Eingabefehler!");
       
                      }        
               }
         }
]

Es tut mir wirklich leid aber ich versuch jetzt seit ner Stunde den Code hier ordentlich formatiert reinzustellen, aba auch wenn ich ihn per Hand einrücke und sieht er bei eingeben gut aus aber wenn ich den Text abschicke schmeißt er unten wieder alles durcheinander.

Mir ist dabei jedoch aufgefallen, dass die öffnenden Klammern von den if Schleifen in den cases alle am Ende hintereinander geschlossen werden. Wenn ich des nich mache hab ich nur noch Fehlermeldungen. Aba damit wirds aufjedenfall zusammenhängen. was bedeuten den orphaned cases die mir in den Zeilen von case 2-4 als fehlermeldungen angezeigt werden?
mfg lulas
 
Zuletzt bearbeitet:
Java:
//Fallunterscheidung
switch (auswahl) {
    case 1: // Mensch vs. Mensch
        Spieler s1 = new Mensch();
        Spieler s2 = new Mensch();

        if (s2.name.equals(s1.name))   {
            do   {
        	    System.out.println("Gleicher Name geht nicht! Bitte anderen Namen nennen:");
        	    Mensch.spielerAnzahl = 2;
        	    s2 = new Mensch();
        	} while (s2.name.equals(s1.name));
        	break;
        	case 2: // ...

Hab dir das jetzt mal richtig formatiert... fällt dir jetzt was auf? Da fehlt nämlich immer nocch eine abschließenede Klammer. Und außerdem liest du immer noch nirgends den Namen ein, was bedeutet, dass sich die jeweilogen Eingenschaften für s1 und s2 wohl NIEMALS ändern, wodurch
Code:
s2.name.equals(s1.name)
immer wahr ist.
 
Die Klammern sind irgendwie für alle drei if-Schelifen am Ende, weis nich wie ich des auflösen soll. So zeigt es mit nämlich nur die orphaned cases an, ansonsten spinnt alles. Der Name wird in der Klasse Mensch/Computer eingelesen/gesetzt die eine Kindklasse der Superklasse Spieler ist.
 
Zuletzt bearbeitet:
Du musst deine Klammern auch schon da machen, wo sie hingehören, und nicht, wo Eclipse (oder sonstwer) dir die hinsetzt, weil sie sonst fehlen. Der Fehler mit deinen orphans wird sich auflösen, wenn du das endlich erledigst...

EDIT: Der Name wird also im Konstruktor Mensch eingelesen? Kein überzeugende Idee, ein Konstruktor sollte - wie HDI bereits erwähnt hat - keine für den Nutzer unvorhersehbaren Ereignisse auslösen, und wer bitte ahnt, dass bei der Kreiierung eines Menschen ein Name eingegeben werden muss. Das solltest du vorher erldeigen, BEVOR du den Menschen baust...
 
Zuletzt bearbeitet:
Also die Klammern jeweils vor dem neuen case aber nach der break Anweisung schließen oder? und wo sollte ich am beste den Namen des Menschen einlesen? Trotzdem in der Klasse Mensch, aber noch bevor ich die Instanz mit dem Konstruktor erzeuge?
danke!

edit: also wenn ich nur die Klammern änder bekomm ich jetzt den Fehler : s1/s2 is already defined in main(java.langString[])

warum nimmt java den meine switch unterscheidung nie an, sondern lässt nur den fall zu dass ich 1 eingebe? was ja dem ersten case entspricht, kann ich des so gar nich machen?
 
Zuletzt bearbeitet:
Also die Klammern jeweils vor dem neuen case aber nach der break Anweisung schließen oder?
SEEEEEEH gut:applaus:
und wo sollte ich am beste den Namen des Menschen einlesen? Trotzdem in der Klasse Mensch, aber noch bevor ich die Instanz mit dem Konstruktor erzeuge?
Es gibt kein wirkliches DAVOR (das ist zwar nicht ganz richtig, wir wollen´s aber dabei belassen). Den Namen sollst du dem Konstruktor als Parameter übergen:
Java:
public Mensch(String name) {
    this.name = name;
...}
Zu deutsch: du musst den Namen im Hauptptogramm auslesen (wo du ja schließlich auch den Großteil deiner TextAUSGABEN machst, naheliegenderweise also auch die TextEINGABEN...).

EDIT: Schick mal, was du jetzt hast, nachdem du deine Klammern korrigiert hast...
 
Also versuch ich mich morgen früh dran alles was ich in meinem Programm einlese also Spielart, Namen und Alter der Spieler im Mainprogramm einzulesen, zu kapseln und dann der Klasse Mensch zu übergeben.

Und im Mainprogramm ist es dann möglich mit der Switch Auswahl entweder Menschen oder Computer (jeweils Kindklassen der Klasse Spieler) als Spieler zu erzeugen? Das war mein Code ohne die switch, wenn ich da jeweils für s1= new Mensch/Computer oder 2* s2= new Mensch/Computer im code direkt eingegeben habe, konnte ich die drei senarios M vs M,M vs C, C vs. C erstellen und die Figuren wurden mit hilfe des Würfels ohne Probleme übers Spielfeld bewegt. Kann so wie ichs versuche aus dem Code mit Hilfe der switch ein Menü zur Auswahl bauen?

Java:
public static void main(String[] args) {
		System.out.println("Spiel gestartet");

		Spielbrett sb = new Spielbrett();

		Spieler s1 = new Mensch();
		Spieler s2 = new Computer();

		if(s2.name.equals(s1.name)){ 
		do{ 
		
		System.out.println("Gleicher Name geht nicht! Bitte anderen Namen nennen:");	
		Mensch.spielerAnzahl = 2;
		s2 = new Computer();
		}while(s2.name.equals(s1.name));
 
Zuletzt bearbeitet:
Das könnte man auch so verkürzen:
Java:
        while(s2.name.equals(s1.name)){ 
          System.out.println("Gleicher Name geht nicht! Bitte anderen Namen nennen:");    
          Mensch.spielerAnzahl = 2;
          s2 = new Computer();
        }
 
Das könnte man auch so verkürzen:

Das ist sogar schlauer, denn mit der fußgesteuerten do-Schleife, die du bisher verwendest, wird der "geht-nicht"-Part auch ausgeführt, wenn beide Namen ungleich sind, da die Bedingung erst NACH dem inneren Block gepüft wird. Es wird also mindestens einmal der Code innerhalb der Schlaife eusgeführt, was wie ich annehme nicht in deinem Interesse liegt. Und so könntest du dir nämlich die einleitende if-Bedingung komplett sparen.
 

Neue Themen


Zurück
Oben