# Problem beim Starten des Programms



## Zam3ck (17. Jan 2015)

Hallo!
Ich habe ein fertiges Hangmanprogramm geschrieben.Als ich es nun starten wollte, wurde mir gesagt, dass die Hauptmethode nicht gefunden wurde.Als ich nun versucht habe "public static void main(String[] args)" einzugeben hatte mein Quelltext Fehler über Fehler.Kann ich das irgendwie umgehen oder kann mir jemand helfen, was ich zur Hauptmethode machen muss?'

```
import java.util.Random;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Hangman

{
	Random r; // um zufällig Worte zu kriegen
	String[] Wörter = { "Hund", "Katze", "Maus" }; // Wortliste, lässt sich
													// erweitern
	String Wort; // ist dafür da um das erhaltene Wort festzuhalten
	int Fehler = 0; // Dort steht jetzt Versuche. Man sollte sich jedoch Fehler
					// denken.Habe das System geändert weil ich es nicht
					// hingekriegt habe den Integer Wert zu verringern:Also habe
					// ich den Integer jeweils immer um einen addiert.
					// gezeichnet hat.Bei jedem fehlgeschlagenem Versuch
					// verringert sich dieser Wert um 1

	String Eingabe;// Eingabe des Buchstaben vom Spieler
	int Länge = Wort.length(); // Wortlänge, diese ist bei x bei jedem gelösten
								// buchstaben verringert sich diese um 1

	public Hangman() throws IOException {
		r = new Random();
		starten();
	}

	public void starten() throws IOException {
		Wort = Wörter[r.nextInt(Wörter.length)];// zufällg ausgewähltes Wort
		int Länge = Wort.length();
		int WortGelöst = 0;
		while (Fehler != 11 && WortGelöst == Länge)// Bedingungen für
													// Hangman.Entweder man hat
													// das Wort gelöst oder zu
													// viele Fehler
													// gemacht.WortGelöst wird
													// bei einem richtigen
													// Buchstaben um 1
													// erhöht.Solange bis es
													// gleich der Länge der
													// Buchstaben im Wort
													// ist.Bei Fehler ist es das
													// glecihe Prinzip.Man setzt
													// Fehler bei jedem Fehler
													// den man gemacht hat um
													// einen höher.Solange bis
													// es 11 erreicht hat

		{

			String wort = Wort;
			System.out.println("Dein Wort besitzt" + Länge
					+ "Buchstaben und du hast " + Fehler + "Fehler gemacht");
			InputStreamReader isr = new InputStreamReader(System.in);
			BufferedReader br = new BufferedReader(isr);
			String eingabe = br.readLine();

			for (int i = 0; i < wort.length(); i++) {
				if (wort.charAt(i) == eingabe.charAt(0)) {
					System.out.println("Buchstabe " + eingabe
							+ " ist an Position " + (i + 1));
					WortGelöst++;

				} else {
					Fehler++;
					System.out.println("Leider falsch.Du hast schon" + Fehler
							+ "Fehler gemacht.Und dein Wort hat" + Länge
							+ "Buchstaben");

				}
				{
					if (Fehler == 11)
						System.out.println("Du hast Verloren!Das Wort war"
								+ Wort + "!");
					else {
						System.out.println("Glückwunsch.Du hast gewonnen!");
					}
				}

			}

		}

	}

}
```
Vielen Dank im Vorraus!


----------



## Saheeda (17. Jan 2015)

Der Compiler braucht irgendeinen Haupteinstiegspunkt. Momentan existiert der nicht, der Compiler weiß also nicht, wo er anfangen soll mit Ausgeben.

Füge also innerhalb der Klasse eine Methode "public static void main(String[]args)" hinzu und rufe in der deine erste Methode auf.

Wenn du dabei eine Fehlermeldung bekommst, dann sag bitte, welche das ist.


----------



## Zam3ck (17. Jan 2015)

Ich habe nun "public static void main(String[]args)" vor Random r; eingefügt
Ich bekomme nun den Fehler"The value of the local variable r is not used"
Und in den Zeilen wo ich r brauche (25 und 30) die Meldung "r cannot be resolved to a variable"


----------



## Saheeda (17. Jan 2015)

Klammern richtig gesetzt?
Wenn eine Variable innerhalb einer Methode definiert wird, ist sie auch nur innerhalb dieser Methode gültig. Ich vermute also mal, du hast r innerhalb der Main stehen. Damit ist sie ein paar Zeilen weiter nicht definiert.

```
import java.util.Random;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
public class Hangman
{

        public static void main(String[]args){
               Hangman game = new Hangman();

        }

	Random r; // um zufällig Worte zu kriegen
	String[] Wörter = { "Hund", "Katze", "Maus" }; // Wortliste, lässt sich
													// erweitern
	String Wort; // ist dafür da um das erhaltene Wort festzuhalten
	int Fehler = 0; // Dort steht jetzt Versuche. Man sollte sich jedoch Fehler
					// denken.Habe das System geändert weil ich es nicht
					// hingekriegt habe den Integer Wert zu verringern:Also habe
					// ich den Integer jeweils immer um einen addiert.
					// gezeichnet hat.Bei jedem fehlgeschlagenem Versuch
					// verringert sich dieser Wert um 1
 
	String Eingabe;// Eingabe des Buchstaben vom Spieler
	int Länge = Wort.length(); // Wortlänge, diese ist bei x bei jedem gelösten
								// buchstaben verringert sich diese um 1
 
	public Hangman() throws IOException {
		r = new Random();
		starten();
	}
 
	public void starten() throws IOException {
		Wort = Wörter[r.nextInt(Wörter.length)];// zufällg ausgewähltes Wort
		int Länge = Wort.length();
		int WortGelöst = 0;
		while (Fehler != 11 && WortGelöst == Länge)// Bedingungen für
													// Hangman.Entweder man hat
													// das Wort gelöst oder zu
													// viele Fehler
													// gemacht.WortGelöst wird
													// bei einem richtigen
													// Buchstaben um 1
													// erhöht.Solange bis es
													// gleich der Länge der
													// Buchstaben im Wort
													// ist.Bei Fehler ist es das
													// glecihe Prinzip.Man setzt
													// Fehler bei jedem Fehler
													// den man gemacht hat um
													// einen höher.Solange bis
													// es 11 erreicht hat
 
		{
 
			String wort = Wort;
			System.out.println("Dein Wort besitzt" + Länge
					+ "Buchstaben und du hast " + Fehler + "Fehler gemacht");
			InputStreamReader isr = new InputStreamReader(System.in);
			BufferedReader br = new BufferedReader(isr);
			String eingabe = br.readLine();
 
			for (int i = 0; i < wort.length(); i++) {
				if (wort.charAt(i) == eingabe.charAt(0)) {
					System.out.println("Buchstabe " + eingabe
							+ " ist an Position " + (i + 1));
					WortGelöst++;
 
				} else {
					Fehler++;
					System.out.println("Leider falsch.Du hast schon" + Fehler
							+ "Fehler gemacht.Und dein Wort hat" + Länge
							+ "Buchstaben");
 
				}
				{
					if (Fehler == 11)
						System.out.println("Du hast Verloren!Das Wort war"
								+ Wort + "!");
					else {
						System.out.println("Glückwunsch.Du hast gewonnen!");
					}
				}
 
			}
 
		}
 
	}
 
}
```


----------



## Zam3ck (17. Jan 2015)

Genau das war der Fehler. Wenn ich jedoch "Hangman game = new Hangman ();" in meine Main einsetze, kriege ich die Fehlermeldung "Unhandled exception type IOException" als ich es nun in "	public static void main(String[]args) throws IOException" umgeändert habe, kriege ich zwar keine Fehlermeldung, aber wenn ich das Programm starten möchte kriege ich folgende Fehlermeldungen
"Exception in thread "main" java.lang.NullPointerException
	at Hangman.<init>(Hangman.java:25)
	at Hangman.main(Hangman.java:10)
"
in Zeile 10 wird mir gesagt dass die local Variable game nicht benutzt wird
Was kann ich da tun? Bei Hangmangame = new Hangman(); spuckt er mir Fehler aus.


----------



## Saheeda (17. Jan 2015)

Die Meldung in Zeile 10 ist nicht so schlimm, du wirst einfach nur darauf hingewiesen, dass du eine ungenutzte Variable hast.
Du könntest auch nur new Hangman() schreiben, aber ich persönlich mag es nicht, Objekte zu erzeugen und nicht zu speichern.

Die andere Fehlermeldung ist da schon wichtiger.
Die Ausgabe ist ein sogenannter Stacktrace, d.h., du kriegst gesagt, wo die Exception auftritt und durch welche Klassen/Methoden sie durchgereicht wird.
Das wird von oben nach unten gelesen. Die erste Zeile gibt an, wo es knallt, die letzte, woher der Aufruf ursprünglich kam.

Du deklarierst zwar eine Variable "Wort", die ist aber noch null (Achtung: "null" hat nix mit der Zahl 0 zu tun!)
Von einer null-Referenz kannst du aber keine Länge abfragen. Wo nix ist, kann nix ausgegeben werden. Also knallts.


Verändere also deinen Code so, dass dieser Fehler nicht mehr auftreten kann.


Mir ist noch nicht klar, warum du eine IO.Exception wirfst. Welche Überlegung steckt dahinter?


----------



## Zam3ck (18. Jan 2015)

Okay, also wie ich es verstanden habe muss ich als erstes Wort erstellen um dann die Länge abzufragen.IO.Exception brauche ich damit ich BufferedReader benutzen kann


----------



## Saheeda (18. Jan 2015)

Wenn du schon Exceptions wirfst, solltest du sie auch behandeln.

Entweder, direkt dort, wo sie auftreten kann:


```
String eingabe = "";
try{
eingabe = br.readLine();
} catch(IO.Exception e){
   e.printStackTrace();
}
```

oder ganz oben, wo du die Hangman-Instanz erzeugst. Imho ist es aber besser, Exceptions direkt an ihrer Quelle zu behandeln.

Du kannst Wort auch erstmal nen leeren String zuweisen, das ist boogy, aber es darf nicht mehr null sein.

Hab noch ein paar Tipps für dich:
- Die Zeilen 27 und 37 sind identisch, schmeiß die erste raus und damit klärt sich auch die NullpointerException.
- Die Deklarationen der Variablen (btw, Variablen werden klein geschrieben) würde ich in die start()-Methode packen. Der Gültigkeitsbereich von Variablen sollte immer so klein wie möglich gehalten werden.
- Welchen Sinn hat Zeile 58: "String wort = Wort;"?


----------



## Zam3ck (18. Jan 2015)

Nun, ich habe jetzt glaub ich mein Problem erkannt.Ich hoffe ich hab den Programmcode nun etwas aufgeräumt und ihn nicht noch unordentlicher gemacht.

```
import java.util.Random;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Hangman

{
	public static void main(String[]args) throws IOException {
		new Hangman();
		
	}
	
	
	

	
	public Hangman() throws IOException {
		r = new Random();
		String wort = wörter[r.nextInt(wörter.length)]; // ist dafür da um das erhaltene Wort festzuhalten
		starten();
	}
	Random r; // um zufällig Worte zu kriegen
	String[] wörter = { "Hund","Katze","Maus" }; // Wortliste, lässt sich
													// erweitern
	String wort;
	int fehler = 0; // Dort steht jetzt Versuche. Man sollte sich jedoch Fehler
					// denken.Habe das System geändert weil ich es nicht
					// hingekriegt habe den Integer Wert zu verringern:Also habe
					// ich den Integer jeweils immer um einen addiert.
					// gezeichnet hat.Bei jedem fehlgeschlagenem Versuch
					// verringert sich dieser Wert um 1
String eingabe;// Eingabe des Buchstaben vom Spieler
	
	public void starten() throws IOException {
		
		int länge = wort.length(); // Wortlänge, diese ist bei x bei jedem gelösten
		// buchstaben verringert sich diese um 1
		int wortGelöst = 0;
		while (fehler != 11 && wortGelöst == länge)// Bedingungen für
													// Hangman.Entweder man hat
													// das Wort gelöst oder zu
													// viele Fehler
													// gemacht.WortGelöst wird
													// bei einem richtigen
													// Buchstaben um 1
													// erhöht.Solange bis es
													// gleich der Länge der
													// Buchstaben im Wort
													// ist.Bei Fehler ist es das
													// glecihe Prinzip.Man setzt
													// Fehler bei jedem Fehler
													// den man gemacht hat um
													// einen höher.Solange bis
													// es 11 erreicht hat

		{

			
			System.out.println("Dein Wort besitzt" + länge
					+ "Buchstaben und du hast " + fehler + "Fehler gemacht");
			InputStreamReader isr = new InputStreamReader(System.in);
			BufferedReader br = new BufferedReader(isr);
			String eingabe = br.readLine();

			for (int i = 0; i < wort.length(); i++) {
				if (wort.charAt(i) == eingabe.charAt(0)) {
					System.out.println("Buchstabe " + eingabe
							+ " ist an Position " + (i + 1));
					wortGelöst++;

				} else {
					fehler++;
					System.out.println("Leider falsch.Du hast schon" + fehler
							+ "Fehler gemacht.Und dein Wort hat" + länge
							+ "Buchstaben");

				}
				{
					if (fehler == 11)
						System.out.println("Du hast Verloren!Das Wort war"
								+ wort + "!");
					else {
						System.out.println("Glückwunsch.Du hast gewonnen!");
					}
				}

			}

		}

	}

}
```

So wenn ich nun das Programm starte erhalte ich den Nullpointer bei Zeile 37

```
int länge = wort.length();
```
Nur frage ich mich warum wort null ist ich habe doch vorher in Zeile 20 wort umgeändert mit einem zufälligem wort aus der Liste wörter
Mir wurde auch gesagt, dass die Variabel nicht benutzt wird.Also muss hier der Fehler sein.
Also ich nun wie du es mir vorgeschlagen hast wort =""; gesetzt habe, fängt mein Programm nun an und sagt mir, dass mein Wort 0 Buchstaben besitzt und ich 0 Fehler gemacht habe.
Wenn ich jedoch wiederum wort mit dem zufälligen Wort aus der Wörterbank besetzen möchte funktioniert es wieder nicht.Was mache ich denn dabei falsch? 
	
	
	
	





```
String wort = wörter[r.nextInt(wörter.length)];
```


----------



## Saheeda (18. Jan 2015)

Schau dir mal Zeile 27 an. Du setzt wort wieder auf null.

Die "Wörterbank" muss über der Wortzuweisung stehen, sonst kann der Compiler nicht wissen, was du mit wörter meinst.
Lies den Code Zeile für Zeile von oben nach unten, dann verstehst dus.


```
String[] wörter = { "Hund","Katze","Maus" };

String wort = wörter[r.nextInt(wörter.length)]; // ist dafür da um das erhaltene Wort festzuhalten
		starten();
	}
```

Desweiteren: Deklariere die Variablen nicht im Konstruktor, sondern in der starten()-Methode. Du kriegst sonst gleich das nächste Reichweiten (Scope) - Problem. Variablen, die im Konstruktor deklariert wurden, gelten auch nur innerhalb des Konstruktors.

Ich werde dir nicht dein komplettes Programm debuggen, davon hast du nix.
Geh dein Programm mit Stift und Papier durch und überlege dir genau, was du eigentlich willst und wie es ablaufen müsste.
Danach kannst du das Schritt für Schritt in Code übersetzen.
Fast alle meiner Kollegen haben neben sich nen Kritzelblock liegen und planen ihre Programmabschnitte erstmal "oldschool".


----------

