Compiler-Fehler Probleme bei Grundlagen

Javasocke

Mitglied
Hallo, ich habe vor kurzem angefangen Java zu lernen, aber habe bis jetzt noch wenig Durchblick und evtl. ist das auch zu Hoch für mich, aber das wird sich zeigen. Ich arbeite zur Zeit nach dem Buch "Java von Kopf bis Fuß" und habe beim Kompilieren der Java-Dateien in der Windows Eingabeaufforderung immer wieder die Anzeige, dass die public Klassen falsch seien. Wie muss das denn dann richtig aussehen?

Das Beispiel ist aus dem Buch und laut Text soll es eben schon ein paar Eindrücke vermitteln, aber auch stark verbesserungswürdig sein, sodass man da später noch dran üben kann. Naja, irgendwas läuft da gar nicht und vielleicht kann mir hier ein schlauer Fuchs helfen.

Java:
public class Ratespiel {
	Spieler s1;
	Spieler s2;
	Spieler s3;

 public void starteSpiel() {
  s1 = newSpieler();
  s2 = newSpieler();
  s3 = newSpieler();

  int tipp1 = 0;
  int tipp2 = 0;
  int tipp3 = 0;
 
  boolean s1hatRecht = false;
  boolean s2hatRecht = false;
  boolean s3hatRecht = false;

  int zielZahl = (int) (Math.random()*10);
  System.out.println("Ich denke mir eine Zahl zwischen 0 und 9 aus ...");

  while (true) {
   System.out.println("Die zu ratende Zahl ist " + zielZahl);

   s1.raten();
   s2.raten();
   s3.raten();

   tipp1 = s1.zahl;
   System.out.println("Spieler 1 tippte " + tipp1);
   
   tipp2 = s2.zahl;
   System.out.println("Spieler 2 tippte " + tipp2);
   
   tipp3 = s3.zahl;
   System.out.println("Spieler 3 tippte " + tipp3);

   if (tipp1 == zielZahl) {
    s1hatRecht = true;
   
   if (tipp2 == zielZahl) {
    s2hatRecht = true;

   if (tipp3 == zielZahl) {
    s3hatRecht = true;

   if (s1hatRecht || s2hatRecht || s3hatRecht) {

	System.out.println("Wir haben einen Gewinner");
	System.out.println("Spieler eins hat richtig geraten? " + s1hatRecht);
        System.out.println("Spieler zwei hat richtig geraten? " + s2hatRecht);
        System.out.println("Spieler drei hat richtig geraten? " + s3hatRecht);
        System.out.println("das Spiel ist aus.");
	break;// Das Spiel ist zu Ende
} else{

System.out.println("Die Spieler müssen es erneut versuchen.");
}
}
}
}

public class Spieler {
 int zahl = 0; //hier kommt der Tipp rein
 
public void raten(){
 zahl= (int) (Math.random() * 10);
 System.out.println("ich tippe auf die Zahl: " + zahl);
}
}

public class SpielStarter {
public static void main (String[] args) {
Ratespiel spiel = new Ratespiel();
spiel.starteSpiel();
}
}
 
Läuft gar nicht... Moment, wo ist wieder meine Glaskugel... Sorry, kann sie gerade nicht finden...

Was heißt "gar nicht"? Compiler-Fehler? Laufzeit-Fehler? Riß im Raum-Zeit-Kontinuum?
 
falls dein Quellcode ein einer Datei liegt: Nur eine public-Klasse in einer Datei.

-die main in die Klasse Ratespiel
-public bei Klasse Spieler weg


die öffnenden geschweiften Klammern bei den 3 if's können eigentlich auch weg.
 
Zuletzt bearbeitet:
irgendwas läuft da gar nicht
das heißt was?

also newSpieler() muss natürlich new Spieler() heißen
Du brauchst dann natürlich auch eine Spieler klasse und jede Klasse würd ich in eine eigene Datei schreiben die so heißt wie die Klasse.java
 
ah, ok das ist es sicher. Für jede klasse eine Datei und die müssten sich doch dann, wenn sie im selben ORdner liegen gegenseitig ansprechen?

Ja, ich hätte mal ein paar angaben mehr machen sollen. Also das Problem war vor allem das mir Fehlermeldungen für die public Klassen gegeben wurden, aber jetzt ist mir klar, warum
 
Ich habe jetzt alle Klassen in verschiedene javadateien gepackt. Also habe ich eine Ratespiel, eine Spieler und eine SpielStarter Datei, die ich mit dem Editor erstellt habe. Können die so schon aufeinander zugreifen? Wenn ich die SpielStarter Datei kompiliere erhalte ich eine Fehlermeldung: .\Ratespiel.java:66:error: reached end of file while parsing
 
grundsätzlich kannst du die auch in eine Datei packen, nur dann darf es nur eine
Code:
public class
geben. Unter anderem ist zwischen
Code:
new
und dem Object ein Leerzeichen zu setzen.
Dein Code kompilierfähig:

Java:
public class Ratespiel {

	Spieler s1;
	Spieler s2;
	Spieler s3;

	public void starteSpiel() {
		s1 = new Spieler();
		s2 = new Spieler();
		s3 = new Spieler();

		int tipp1 = 0;
		int tipp2 = 0;
		int tipp3 = 0;

		boolean s1hatRecht = false;
		boolean s2hatRecht = false;
		boolean s3hatRecht = false;

		int zielZahl = (int) (Math.random() * 10);
		System.out.println("Ich denke mir eine Zahl zwischen 0 und 9 aus ...");

		while (true) {
			System.out.println("Die zu ratende Zahl ist " + zielZahl);

			s1.raten();
			s2.raten();
			s3.raten();

			tipp1 = s1.zahl;
			System.out.println("Spieler 1 tippte " + tipp1);

			tipp2 = s2.zahl;
			System.out.println("Spieler 2 tippte " + tipp2);

			tipp3 = s3.zahl;
			System.out.println("Spieler 3 tippte " + tipp3);

			if (tipp1 == zielZahl) {
				s1hatRecht = true;

				if (tipp2 == zielZahl) {
					s2hatRecht = true;

					if (tipp3 == zielZahl) {
						s3hatRecht = true;

						if (s1hatRecht || s2hatRecht || s3hatRecht) {

							System.out.println("Wir haben einen Gewinner");
							System.out
									.println("Spieler eins hat richtig geraten? "
											+ s1hatRecht);
							System.out
									.println("Spieler zwei hat richtig geraten? "
											+ s2hatRecht);
							System.out
									.println("Spieler drei hat richtig geraten? "
											+ s3hatRecht);
							System.out.println("das Spiel ist aus.");
							break;// Das Spiel ist zu Ende
						} else {

							System.out
									.println("Die Spieler müssen es erneut versuchen.");
						}
					}
				}
			}
		}
	}
}

class Spieler {
	int zahl = 0; // hier kommt der Tipp rein

	public void raten() {
		zahl = (int) (Math.random() * 10);
		System.out.println("ich tippe auf die Zahl: " + zahl);
	}
}

class SpielStarter {
	public static void main(String[] args) {
		Ratespiel spiel = new Ratespiel();
		spiel.starteSpiel();
	}
}
 
Deshalb dringendst:
Formatier deinen Code richtig, (siehe jgh), dann fallen solche Fehler sofort auf, und das ganze wird (auch für dich) viel leichter lesbar!
Das mach dir auch jede IDE automatisch (Eclipse).

PS: Sonst sieht es eh schon gut aus! Gratuliere!
 
1) eigentlich müsste die Klasse in der main(String[]) steht public sein ... ist mir neu das es auch ohne public class geht ...
2) es fehlen immer noch die Konstruktoren der Klassen ...
3) dein Code ist nicht logisch Strukturiert denn das innerste if() wird nur gecallt wenn alle drei anderen if() ebenfalls true sind ... ansonsten kommt der Code gar nicht erst bis dahin
4) Datenkapselung : du greifst direkt auf Member der Klasse Spieler zu ... sowas macht man nicht sondern verwendet Getter ...
5) die while() ist ziemlich sinnlos und führt so zu nem endlos-run was den CPU ziemlich auslastet da es kein sleep gibt und man die Ausgabe nich mal richtig mitbekommt

Das "Java von Kopf bis Fuß" nicht gerade das beste Anfänger-Buch ist wurde hier im Forum schon öfter genannt ... aber das die anderen "Profis" hier dann nicht mal auf die oben genannten Punkte hinweisen find ich viel trauriger ...

Hier mal mein Versuch

Java:
import java.util.Random;
public class SpielStarter
{
	public static void main(String[] args)
	{
		Ratespiel spiel=new Ratespiel();
		spiel.spiele();
	}
}
class Ratespiel
{
	private Spieler s1=null;
	private Spieler s2=null;
	private Spieler s3=null;
	private Random random=null;
	public Ratespiel()
	{
		s1=new Spieler();
		s2=new Spieler();
		s3=new Spieler();
		random=new Random();
	}
	public void spiele()
	{
		while (true)
		{
			System.out.println("Ich denke mir eine Zahl zwischen 0 und 9 aus ...");
			int zahl=random.nextInt(10);
			System.out.println("Die zu ratende Zahl ist "+zahl);
			int tipp1=s1.raten();
			int tipp2=s2.raten();
			int tipp3=s3.raten();
			System.out.println("Spieler 1 tippte " + tipp1);
			System.out.println("Spieler 2 tippte " + tipp2);
			System.out.println("Spieler 3 tippte " + tipp3);
			if(tipp1==zahl||tipp2==zahl||tipp3==zahl)
			{
				System.out.println("Wir haben einen Gewinner");
				System.out.println("Spieler 1 hat"+((tipp1==zahl)?" ":" nicht ")+"richtig geraten");
				System.out.println("Spieler 2 hat"+((tipp2==zahl)?" ":" nicht ")+"richtig geraten");
				System.out.println("Spieler 3 hat"+((tipp3==zahl)?" ":" nicht ")+"richtig geraten");
				break;
			}
			else
			{
				System.out.println("Die Spieler müssen es erneut versuchen.");
			}
		}
	}
}
class Spieler
{
	private Random random=null;
	public Spieler()
	{
		random=new Random();
	}
	public int raten()
	{
		return random.nextInt(10);
	}
}

Beispielausgabe :
Code:
Ich denke mir eine Zahl zwischen 0 und 9 aus ...
Die zu ratende Zahl ist 1
Spieler 1 tippte 3
Spieler 2 tippte 0
Spieler 3 tippte 6
Die Spieler müssen es erneut versuchen.
Ich denke mir eine Zahl zwischen 0 und 9 aus ...
Die zu ratende Zahl ist 6
Spieler 1 tippte 7
Spieler 2 tippte 7
Spieler 3 tippte 8
Die Spieler müssen es erneut versuchen.
Ich denke mir eine Zahl zwischen 0 und 9 aus ...
Die zu ratende Zahl ist 0
Spieler 1 tippte 8
Spieler 2 tippte 4
Spieler 3 tippte 0
Wir haben einen Gewinner
Spieler 1 hat nicht richtig geraten
Spieler 2 hat nicht richtig geraten
Spieler 3 hat richtig geraten
 
1) ...
2) ...
3) ...
4) ...
...

... aber das die anderen "Profis" hier dann nicht mal auf die oben genannten Punkte hinweisen find ich viel trauriger ...

Ruuuuhig Brauner!😳

Der erste Post beginnt mit:
Hallo, ich habe vor kurzem angefangen Java zu lernen, aber habe bis jetzt noch wenig Durchblick
Wir haben's also mit eoinem Anfänger zu tun.
Und eine pädogogische Regel lautet: Konzentrier dich immer auf 1 Punkt/Fehler/Lernthema, außer der Schüler fragt nach mehr.

Klar hast du recht mit allen Punkten.
Klar gibt es KEIN Programm das man nicht auf die eine oder andere Art optimieren könnte.
(... auch dein Beispiel ist noch nicht das ultimativ perfekte)
Aber lass ihn mal erst in der Thematik ankommen.
Helfen wir ihm mal erst ein (nicht mehr gaaanz triviales) Programm zum Laufen zu bringen.

Und Schritt für Schritt wird er sicherer
und Schritt für Schritt wird er mehr Feinheiten berücksichtigen und für anspruchsvolleres zugänglich.

Loben wir doch mal, was er gut gemacht hat:
  • CamelCase konsequent richtig verwendet! TOLL!
  • Programm recht ordentlich strukturiert! SUPER!
  • Klassen einigermaßen verstanden! GRANDIOS!
  • 2 Kommentare sind auch schon drin! NA ALSO!
Wird schon werden!
 
Habe einfach mal das Beispiel kopiert, die Klammern richtig gesetzt und alles formatiert:

Java:
public class Spieler {

    int zahl = 0; //hier kommt der Tipp rein

    public void raten() {
        zahl = (int) (Math.random() * 10);
        System.out.println("ich tippe auf die Zahl: " + zahl);
    }
}

Java:
public class Ratespiel {

    Spieler s1;
    Spieler s2;
    Spieler s3;

    public void starteSpiel() {
        s1 = new Spieler();
        s2 = new Spieler();
        s3 = new Spieler();

        int tipp1 = 0;
        int tipp2 = 0;
        int tipp3 = 0;

        boolean s1hatRecht = false;
        boolean s2hatRecht = false;
        boolean s3hatRecht = false;

        int zielZahl = (int) (Math.random() * 10);
        System.out.println("Ich denke mir eine Zahl zwischen 0 und 9 aus ...");

        while (true) {
            System.out.println("Die zu ratende Zahl ist " + zielZahl);

            s1.raten();
            s2.raten();
            s3.raten();

            tipp1 = s1.zahl;
            System.out.println("Spieler 1 tippte " + tipp1);

            tipp2 = s2.zahl;
            System.out.println("Spieler 2 tippte " + tipp2);

            tipp3 = s3.zahl;
            System.out.println("Spieler 3 tippte " + tipp3);

            if (tipp1 == zielZahl) {
                s1hatRecht = true;
            }
            if (tipp2 == zielZahl) {
                s2hatRecht = true;
            }
            if (tipp3 == zielZahl) {
                s3hatRecht = true;
            }
            if (s1hatRecht || s2hatRecht || s3hatRecht) {
                System.out.println("Wir haben einen Gewinner");
                System.out.println("Spieler eins hat richtig geraten? " + s1hatRecht);
                System.out.println("Spieler zwei hat richtig geraten? " + s2hatRecht);
                System.out.println("Spieler drei hat richtig geraten? " + s3hatRecht);
                System.out.println("das Spiel ist aus.");
                break;// Das Spiel ist zu Ende
            } else {
                System.out.println("Die Spieler müssen es erneut versuchen.");
            }
        }
    }
}

Java:
public class SpielStarter {

    public static void main(String[] args) {
        Ratespiel spiel = new Ratespiel();
        spiel.starteSpiel();
    }
}

Ausgabe:

Code:
Ich denke mir eine Zahl zwischen 0 und 9 aus ...
Die zu ratende Zahl ist 7
ich tippe auf die Zahl: 8
ich tippe auf die Zahl: 9
ich tippe auf die Zahl: 0
Spieler 1 tippte 8
Spieler 2 tippte 9
Spieler 3 tippte 0
Die Spieler müssen es erneut versuchen.
Die zu ratende Zahl ist 7
ich tippe auf die Zahl: 4
ich tippe auf die Zahl: 7
ich tippe auf die Zahl: 1
Spieler 1 tippte 4
Spieler 2 tippte 7
Spieler 3 tippte 1
Wir haben einen Gewinner
Spieler eins hat richtig geraten? false
Spieler zwei hat richtig geraten? true
Spieler drei hat richtig geraten? false
das Spiel ist aus.

Es ist schon stimmig, dass sich der zu ratende Spieler die geratene Zahl merkt. Im Sinne der OOP verändert ein Objekt seinen Zustand.

Das Prinzip der Datenkapselung kommt bestimmt noch. Eine nicht als public deklarierte Klasse zum Starten des Programms habe ich jetzt auch nicht gesehen.

Würde sagen, ein gutes Beispiel, durch das man auch anhand der vielen Ausgaben viel lernen kann
 

Neue Themen


Zurück
Oben