Switch-Anweisung - Find den Fehler nicht

Memphis01

Grünschnabel
Hallo liebe Community,
ich hab mir mal nach und nach ein Programm zusammen gebaut und habe mich an „alte“ c Zeiten erinnert, als es noch tolle Menüs mit Switch-Anweisungen gab.

Nun habe ich nen doch etwas größeres Java Programm geschrieben und möcht es mit so einem super tollem Menü hinterlegen. War bis zum heutigen Tag eigentlich auch nie ein Problem solche Menüs zusammen zu basteln.

Aber heute zweifel ich an mir.

Ok also den Char für das Menü definiere so.

Code:
	static char menuC=' ';

so sieht meine main aus

Code:
	public static void main(String[] args) {
		// Deklarierung des Log Dateinamens ("Dateiname")
		protokoll.logger_einschalten(logpfad);
		protokoll.logger.debug("[Start]>");

		eingabeMenu();
		
		protokoll.logger.debug("<[Ende]");
    }

und das ist mein Eingabemenü in dem ich folgendes Problem habe.
In der 1ten Switch Anweisung wartet er am System.in.read() auf eine Eingabe, so sollt es auch sein, nach der Eingabe des Char springt er in die Case Anweisung, in dem ein weiterer Switch steck. Das Problem ist, er überspringt die System.in.read(), erkennt logischerweise den Buchstaben nicht als richtig und springt ins default.

Code:
public static void eingabeMenu()
	{
		BufferedReader in = new BufferedReader(
              				new InputStreamReader(System.in));
		
		//Runtime.getRuntime().exec("cls");
		System.out.println	("Menü");
		System.out.println	("P - Personal");
		System.out.println	("U - Übersicht");
		System.out.println	("L - Log");
		System.out.println	("B - Beenden");
		System.out.print	("Bitte wählen Sie:\t");
    	
		try {
			menuC =(char) in.read();
			menuC=Character.toUpperCase(menuC);
			}
    	catch (IOException e) {protokoll.logger.debug(e);}
    	
    	switch (menuC)
    	{
    	case 'P': 	{
    				System.out.println	("Personal");
		    		System.out.println	("E - Erstellen");
		    		System.out.println	("A - Anzeigen");
		    		System.out.println	("L - Löschen");
		    		System.out.println	("B - Beenden");
		    		System.out.print	("Bitte wählen Sie:\t");
		    		
		    		try {
		    			menuC =(char) in.read();
		    			menuC=Character.toUpperCase(menuC);
		    			}
		        	catch (IOException e) {protokoll.logger.debug(e);}
		    		
		    		switch (menuC)
	        		{
		        	case 'E': 	
		        		{
		        		eingabePersonal();
					    Textdatei_Schreiben(pfad);
					    }break;
		        	
		        	case 'A': 	
		        		{
		        		Textdatei_auslesen(pfad);
		        		}break;

		        	case 'L': 	
		        		{
		        		System.out.println("Noch nicht Implementiert");
		        		}break;
		        	
		        	case 'B': 	
		        		{
		        		eingabeMenu();
		        		}break;
		        
		        	default : 	
		        		{
		        		System.out.println("Ungültige Eingabe - Hauptmenü");
		        		eingabeMenu();
		        		}
	        		}
    				}break;
    	
    	case 'U': 	{
		    		System.out.println	("Übersicht");
		    		System.out.println	("P - Personal Anzeigen");
		    		System.out.println	("L - Log Anzeigen");
		    		System.out.println	("B - Beenden");
		    		System.out.print	("Bitte wählen Sie:\t");
		    		try {
		    			menuC =(char) in.read();
		    			menuC=Character.toUpperCase(menuC);
		    			}
		        	catch (IOException e) {protokoll.logger.debug(e);}
		    		
		    		switch (menuC)
	        		{
		        	case 'P': 	
		        		{
		        		Textdatei_auslesen(pfad);
		        		}break;
		        		
		        	case 'L': 	
		        		{
		        		Textdatei_auslesen(logpfad);
		        		}break;
		        		
		        	case 'B': 	
		        		{
		        		eingabeMenu();
		        		}break;
		        	
		        	default : 	
		        		{
		        		System.out.println("Ungültige Eingabe - Hauptmenü");
		        		eingabeMenu();
		        		}
	        		}
    				}break;
    	
    	case 'L': 	{
    				System.out.println	("Log");
		    		System.out.println	("A - Log Anzeigen");
		    		System.out.println	("L - Log Löschen");
		    		System.out.println	("B - Beenden");
		    		System.out.print	("Bitte wählen Sie:\t");
		    		try {
		    			menuC =(char) in.read();
		    			menuC=Character.toUpperCase(menuC);
		    			}
		        	catch (IOException e) {protokoll.logger.debug(e);}
		    		
		    		switch (menuC)
	        		{
		        	case 'A': 	
		        		{
		        		Textdatei_auslesen(logpfad);
		        		}break;
		        	
		        	case 'L': 	
		        		{
		        			Datei_loeschen(pfad);
		        		}break;
		        	
		        	case 'B': 	
		        		{
		        			eingabeMenu();
		        		}break;
		        	
		        	default : 	
		        		{
		        		System.out.println("Ungültige Eingabe - Hauptmenü");
        				eingabeMenu();
        				}
		        	}
    				}break;
    	
    	case 'B': 	{
    				System.out.println("Noch nicht Implementiert");
    				}break;
    				
    	default :	{
    				System.out.println("Ungültige Eingabe - Hauptmenü");
    				eingabeMenu();
    				}
    	}
	}

Hab ergänzend noch eine Frage da meine Erinnerungen doch sehr lückenhaft sind, man sagt auch Kopf wie ein Sieb ;P

Wie schaffe realisiere ich es das ich den Character nicht mit [Eingabe] bestätigen muss, sondern das er den gedrückten Buchstaben direkt als Einnahme übernimmt

Danke liebe Community
 
Hast du schon mal deine Protokolldatei angesehen?
Wenn das zweite read nicht ausgeführt wird, spricht das dafür, dass er nicht in den try-Block reinkommt.
 
Danke für die erste Rasche antwort


habe den code zur prüfung etwas geändert.

Code:
		try {
			protokoll.logger.debug("[1ter Try Block]");
			menuC =(char) in.read();
			menuC=Character.toUpperCase(menuC);
			}

+

Code:
		try {
			protokoll.logger.debug("[2ter Try Block]");
			menuC =(char) in.read();
			menuC=Character.toUpperCase(menuC);
			}
also mein Log sieht so aus

2008-08-28 10:11:15,670 [Start]>
2008-08-28 10:11:15,670 [1ter Try Block]
2008-08-28 10:11:18,842 [2ter Try Block]
2008-08-28 10:11:18,842 [1ter Try Block]

das heisst er geht schon in den Try Block rein, nur macht er da nichts
 
N'Abend zusammen

ich hab mal drauf geguckt und ein bischen rumgespielt, also wenn ich einen 2ten Bufferedinputstream noch einbinde, in den Case Abfragen

Java:
case 'U': 	{BufferedReader bin = new BufferedReader(
              				new InputStreamReader(System.in));
		    		System.out.println	("Übersicht");
		    		System.out.println	("P - Personal Anzeigen");
		    		System.out.println	("L - Log Anzeigen");
		    		System.out.println	("B - Beenden");
		    		System.out.print	("Bitte wählen Sie:\t");
		    		try {
		    			menuC =(char) bin.read();
		    			menuC=Character.toUpperCase(menuC);
		    			}
		        	catch (IOException e) {System.out.println(e);}
		    		
		    		switch (menuC)
	        		{
		        	case 'P': 	
		        		{
		        		System.out.println("P");
		        		}break;
Dann kriege ich als Output:

P - Personal
U - Übersicht
L - Log
B - Beenden
Bitte wählen Sie:
u
U
Übersicht
P - Personal Anzeigen
L - Log Anzeigen
B - Beenden
Bitte wählen Sie:
p
P

Wobei ich hier nur ein System.out.println() benutzt habe und nicht deine Methoden.

LG Sebastian
 
Das Problem liegt im read() Befehl.
Damit liest du ein zeichen aus.
Da aber im Stream zu diesem zeitpunkt noch mindestens ein Zeichen mehr (das end line) ist, liest dein zweiter read() direkt ein, ohne noch auf eine Eingabe warten zu müssen.
(sind noch mehr zeichen drin geht das spielchen immer so weiter)
mit read line (genauen befehl weiß ich nicht aus dem kopf) bekommst du die ganze zeile (glaub als char array).Das erste zeichen ist das was du brauchst.

der Vorteil ist dann, dass du den in Stream wieder leer hast.

auf einzelne Tastendrucke in der Konsole zu reagieren ist meines wissens nicht möglich, aber ich lasse mich gerne eines Besseren belehren.
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück