# Nach catch mit der schleife weitermachen



## Meran (16. Aug 2009)

Hallo, ich lerne erst seit einigen Tagen Java, daher bitte nicht wundern, dass ich bestimmt nicht alles optimal gelöst habe.
Mein Problem ist folgendes: Der User soll immer wieder zu einem Auswahlmenü kommen, was auch so lange klappt, bis er durch falsche eingaben (Buchstaben bei einem int in meinem Fall) eine Exception auslöst, was dann zum Beenden des Programms führt, obwohl ich die Exception catche und eigentlich möchte, dass er dann mit der Schleife weiter macht, so dass der User zurück ins Menü kommt.


```
try{
		while(true){
		System.out.println("Was möchten sie machen?");
		System.out.println("1: Kontobesitzer anzeigen lassen.\n2: Kontostand anzeigen lassen.\n3: Geld auf das Konto bringen.
\n4: Geld vom Konto abholen.\n5: Das Programm Beenden.");
		int ein = sc.nextInt();
		switch (ein) {
			case 1:
				System.out.println(Name);
				Thread.sleep(1000);
				break;
			case 2:
				System.out.println(kto.getKontostand() + " €");
				Thread.sleep(1000);
				break;
			case 3:
				System.out.println("Wie viel Geld möchten sie auf ihr Konto bringen?
(Ohne Euro-, aber ggf. mit Kommazeichen, nicht mit Punkt.)");
				kto.setKontostand(sc2.nextDouble());
				System.out.println("Transaktion erfolgreich.");
				Thread.sleep(1000);
				break;
			case 4:
				System.out.println("Wie viel Geld möchten sie von ihrem Konto abholen?
(Ohne Euro-, aber ggf. mit Kommazeichen, nicht mit Punkt.)");
				kto.setKontostand2(sc2.nextDouble());
				System.out.println("Transaktion erfolgreich.");
				Thread.sleep(1000);
				break;
			case 5:
				pw.println(Name);
				pw.println(kto.getKontostand());
				pw.close();
				System.exit(0);
			
		
		
		}}}
		catch (Exception e) {System.out.println("Nur Zahlen bitte.");};
```

Was muss ich ändern, damit ich auch nach der Exception weiter in der Schleife, also im Menü, bleibe?


Eine Frage die damit in Verbindung steht: Kann ich irgendwie einen Punkt in meinem Quellcode festlegen und mit einem Befehl dann zurück zu diesem Punkt springen? So könnte man dieses (und noch einige andere Probleme von mir) lösen.


----------



## SlaterB (16. Aug 2009)

das try/ catch muss in die while-Schleife

sowas immer mit 10 Zeilen Test-Code testen

while (true) {
try {
test;
}catch(Exception e) {

}
}
nicht mitten in 40 Zeilen echter Anwendung


----------



## Meran (16. Aug 2009)

Ich habe das try jetzt in die while Schleife gesetzt und die Klammern dementsprechend verändert. Jetzt komme ich zwar ins Menü zurück, aber sobald ich da eine Option auswähle, die mit einem Inputstream zu tun hat, tut er direkt so, als hätte ich wieder etwas eingegeben, was eine Exception auslöst, zeigt den Exception Text an und ich komme zurück ins Menü.
Bei einer gerade gemachten kleinen Testdatei passiert genau das gleiche.
Wie kann ich das verhindern, so dass das Programm normal weiter funktioniert?


----------



## SlaterB (16. Aug 2009)

diese Erklärung kann ich nicht nachvollziehen

> tut er direkt so, als hätte ich wieder etwas eingegeben
was bedeutet das, werden wirklich echte Zeichen gelesen? welche? mehrmals die gleichen?,
oder wird eine Eingabe übersprungen oder was genau,

Code wäre dazu sicherlich auch günstig,
möglichst kurz, es müssen doch sicher nicht alle case-Fälle sein

edit: kann sein, dass du eine Exception bei Scanner.nextInt() oder so meinst und dann danach immer noch die gleichen Daten im Scanner stehen,
dann musst du diese per Scanner.nextLine() oder so leeren


----------



## Meran (16. Aug 2009)

```
package test;
import java.util.Scanner;
public class Except {
	public static void main(String[] args) {

		Scanner sc = new Scanner (System.in);
	
	
		
		while (true) {
			try {
			System.out.println("Test");	
			int Zahl = sc.nextInt();
			
			
			
			}catch(Exception e) {
				System.err.println("Fehler");
			}
			
	}

}}
```
Das ist meine Testanwendung. Solange ich Zahlen eingebe gibt es keine Probleme, sobald ich einen Buchstaben eingebe, kommen unendlich lange "Test" und "Fehler" ausgaben, ohne dass ich irgendetwas eingeben könnte, oder, dass irgendeine Eingabe angezeigt wird.


Edit: Wo genau muss ich dann das Scanner.nextLine(); eingeben (Zum Beispiel in diesem Testprogramm)?


----------



## SlaterB (16. Aug 2009)

}catch(Exception e) {
                System.err.println("Fehler");
sc.nextLine(); // Eingabe ziemlich sicher ohne Exception lesen + nicht verarbeiten = Eingabe löschen

            }


----------



## Painii (16. Aug 2009)

```
catch(Exception e){
System.out.println("Fehler");
}
```
1.Sowas ist selten gut, fang lieber nur die spezielle Exception die auftreten kann (sicher irgendwas mit NumberFormat oder so wenn du statt ner Zahl einen Buchstaben eingibst)
2. Juhu, ein Fehler. Und was für einer? Wenn du eine Fehlerausgabe machst schreib am besten die Exception immer mit rein (z.b. e.printStackTrace(); )

3. Ich würde raten dass es an dem Scanner liegt, ich meine irgendwo hier nen Thread letztens gesehen zu haben wo es ein ähnliches Problem war... Einfachste Möglichkeit:

```
while(true){
scanner = new Scanner(System.in);
//try-catch
```
Damit ist auf jeden Fall sichergestellt das dein Scanner leer ist und keine Zeichen mehr auf Bearbeitung warten.

edit: oder so wie von SlaterB empfohlen, seine Variante ist wohl besser (weil du nicht immer nen neuen Scanner baust)


----------



## Meran (16. Aug 2009)

@SlaterB Danke für deine schnelle Hilfe, jetzt läuft es so, wie ich es wollte.

@Painii Im Moment fange ich noch alle Exceptions, weil das Programm noch im Aufbau ist. Es soll zB noch in eine Datei schreiben und aus ihr lesen, daher habe ich das im Moment erst mal allgemein gehalten, bis ich mit dem Programm fertig bin und dann wollte ich die Exceptions genau angeben.
Und in meinem richtigen Datei wird zwar nicht die genaue Exception angegeben, dafür sage ich dem User aber, dass er nur Zahlen eingeben darf (was er gerade augenscheinlich nicht gemacht hat, sonst wäre der Fehler ja nicht gekommen) was dem Standarduser wahrscheinlich mehr sagt, als eine Java Exception.
Trotzdem danke für deine konstruktive Kritik.


----------



## Painii (16. Aug 2009)

Meran hat gesagt.:


> Im Moment fange ich noch alle Exceptions, weil das Programm noch im Aufbau ist. Es soll zB noch in eine Datei schreiben und aus ihr lesen, daher habe ich das im Moment erst mal allgemein gehalten, bis ich mit dem Programm fertig bin und dann wollte ich die Exceptions genau angeben.


Mach es doch lieber gleich unterteilt.
Wenn du sowieso vorhast es später einzeln zu machen, mach es doch gleich.
Sonst musst du später durch alle Files gehen und alle catch-Blöcke umformulieren, was je nach Programmlänge sehr lange dauern kann (du musst dich ja dann in jeden catch-block einlesen, schauen welche Exceptions kommen können und wie du die da genau handhabst)



> Und in meinem richtigen Datei wird zwar nicht die genaue Exception angegeben, dafür sage ich dem User aber, dass er nur Zahlen eingeben darf (was er gerade augenscheinlich nicht gemacht hat, sonst wäre der Fehler ja nicht gekommen) was dem Standarduser wahrscheinlich mehr sagt, als eine Java Exception.


Ja natürlich, aber das mit dem "Fehler" hast du ja für dich geschrieben - und dir als Programmierer wird ein "Fehler" nicht so viel helfen wie eine präzise Angabe in welcher Zeile was falsch gelaufen ist.

In dem Beispiel hast du nur eine Fehlerquelle, aber später wird das eben nichtmehr so leicht auszumachen sein was denn nun genau falsch läuft, da hilft dann eine präzise Zeilenangabe schon.


----------



## Meran (16. Aug 2009)

Ja stimmt, sobald das Programm lang ist und es viele Fehlerquellen sind wäre es für den Programmierer nützlich. Ich hatte jetzt mehr an den User gedacht, der keine Ahnung von Java hat und einfach ein funktionierendes Programm möchte, denn der wird von einer Exception ja eher verwirrt, aber ich kann die Exceptions ja jetzt noch einbinden und erst wenn ich komplett fertig bin, die genaue Exceptionausgabe rausnehmen.
Dann änder ich das jetzt mal, damit es direkt richtig ist.


----------

