While-Schleife läuft nicht durch

key

Mitglied
Hallo zusammen,

ich habe folgendes Problem:

Ich will einen Text-"Verschlüssler" schreiben (ausschließlich zum Üben). Der Benutzer wird aufgefordert. etwas in die Konsole einzugeben und nach jedem Buchstaben mit - zu trennen. Das Programm liest die Eingabe und splittet den String wieder in einzelne Buchstaben.

Ich wollte das String[] splitted = code.split("-"); realisieren und dabei die einzelnen Buchstaben auf einen String schreiben -> String buchstabe = splitted[0];

Da ich ja jetzt für jeden Buchstaben einen String schreiben und für jeden String den if.Equals schreiben müsste, wäre das mehr Programmcode als nötig (denke ich 😀).

Nun dachte ich, ich schreibe in die main void einen Int a = 0; und lasse den am Ende der While-Schleife mit a++ immer um 1 addieren, um den nächsten Split aus Code auf den String buchstabe zu schreiben.

Nun mein Problem: die Schleife wird leider nur 1 Mal ausgeführt, was nach der Schleife passiert wird überhaupt nicht ausgeführt (System.out....). Was habe ich übersehen? Danke 😀

Java:
	public static void main(String[] args)
	throws IOException
	{
		
		
		Writer schreib = null;
		
		schreib = new FileWriter( "xxx.txt", true); 
		
		int a = 0;
		

		System.out.println("Buchstaben eingeben, buchstabenweise getrennt mit -");
	

		BufferedReader ein = new BufferedReader(new InputStreamReader(System.in));
	
		
		String kompleing = null;
		
	
		while ((kompleing = ein.readLine()) != null) {

			String[] splitted = kompleing.split("-");
			
			String buchstabe = splitted[a];
	
			
			if(buchstabe.equals("a"))
			{
				try 
					{
						schreib.write("aAaAa-"); 
						schreib.close();
					}
			
			
				catch ( IOException e )
					{ 
						System.err.println( "Konnte Zeile nicht schreiben..." ); 
					} 
			}
				
			
			
			else if(buchstabe.equals("b"))
			{
				try 
					{
						schreib.write("bBbBb-"); 
						schreib.close();
					}
				
				
				catch ( IOException e )
					{ 
						System.err.println( "Konnte Zeile nicht schreiben..." ); 
					} 
			}
			
			a++;	
		
			
		}
		
		
		System.out.println("Datei wurde erstellt");
			
	}
 
Java:
    schreib.close();
Das schließst dir deinen Writer und danach kannst du diesen nicht mehr verwenden. Das close gehört hinter die while schleife.

Nebenbei: Strings haben auch die charAt(index i) Methode, damit bekommst du den Buchstaben an stelle i. Dann brauchst du bei der Eingabe auch nicht mit - arbeiten, sondern kannst den String direkt einlesen.
 
Zuletzt bearbeitet:
> die Schleife wird leider nur 1 Mal ausgeführt, was nach der Schleife passiert wird überhaupt nicht ausgeführt (System.out....).
was genau stellst du denn als Verhalten fest?
wenn man einmal eine Zeile eintippt und Enter tippt, dann wartet das Programm auf die nächste Zeile,
die Schleife ist noch nicht beendet, kann dieser Normalzustand das sein was du als was auch immer bezeichnest?

wie sollte das Programm deinen Wünschen nach nach dem Enter reagieren?
evtl. dazu wichtig: wie willst du mehrere Zeilen eintippen, wozu die Schleife?
auf welche Weise soll die Schleife je beendet werden, das danach drankommen?
 
Danke für die Antwort

Grundsätzlich ist das richtig aaaaber..
...das habe ich schon probiert, wenn ich es nach der Schleife schreibe, schreibt er garnichts. Das heißt also, er führt die Schleife 1 Mal aus (wie bei While so typisch 😉, macht aber dann weder mit der Schleife noch mit dem restlichen Code weiter... Ich gehe davon aus, dass es ein Problem in der Bedingung gibt.

Hast die vielleicht eine Alternative, die die länge des kompleing(Komplette Eingabe)-Strings in einen Int-Wert schreibt?
 
Versuch es mal mit einer do-while schleife:
Java:
do{
...
}while(Bedingung)
Wenn du eine normale While schleife nimmst, dann müsstest du dafür sorgen, dass kompleing != null ist 😉
Kannst du natürlich auch machen.

Die Länge eines Strings fragt man mit .length ab 😉
 
Du ließt einen kompletten String ein, verarbeitest dann in der Schleife aber nur das erste Zeichen. Wenn du nur einen String verschlüsseln willst solltest du die while Schleife vergessen und folgendes machen:
1. String einlesen
2. String splitten und String[] Array erstellen
3. for Schleife von 0 bis Arraylänge
3.1 Buchstabe s verschlüsseln
 
> die Schleife wird leider nur 1 Mal ausgeführt, was nach der Schleife passiert wird überhaupt nicht ausgeführt (System.out....).
was genau stellst du denn als Verhalten fest?
wenn man einmal eine Zeile eintippt und Enter tippt, dann wartet das Programm auf die nächste Zeile,
die Schleife ist noch nicht beendet, kann dieser Normalzustand das sein was du als was auch immer bezeichnest?

wie sollte das Programm deinen Wünschen nach nach dem Enter reagieren?
evtl. dazu wichtig: wie willst du mehrere Zeilen eintippen, wozu die Schleife?
auf welche Weise soll die Schleife je beendet werden, das danach drankommen?

Mit Enter soll die Schleife anfangen den String zu splitten (durch -, das eingegeben werden muss), ihn mit jeder Ausführung dem String (Buchstabe) einen neuen Teil vom Split zutragen. Die Schleife soll enden, wenn alle Buchstaben verarbeitet wurden.
 
Das mit dem - solltest du lassen, siehe oben.

Deine While-Schleife liest bei jedem Durchgang einen String ein. Statt einen Buchstaben deiner Eingabe zu verarbeiten. Auch dies siehe oben.
 
Du suchst wohl eher sowas 😉
Java:
public static void main(String[] args)
	{
		try
		{
			BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
			BufferedWriter writer = new BufferedWriter(new FileWriter("xxx.txt"));
			String input = null;
			
			do
			{
				System.out.println("Bitte Buchstaben eingeben und mit Enter bestätigen.");
				input = reader.readLine();
				
				for (char c : input.toCharArray())
				{
					switch (c)
					{
						case 'c': writer.append("lulz ");  break;
					}
				}
			}
			while(!"".equals(input));
			
			writer.close();
			System.out.println("Programm beendet");
		}
		catch (IOException exception)
		{
			exception.printStackTrace();
		}
	}
 
Also ich habe das Projekt ein wenig umgebastelt, es funktioniert nun einwandfrei.

Das mit dem Splitten in der Schleife war ziemlich dumm - danke!

Ich splitte den String nun vor der Schleife (bin bei While geblieben😉. NACH! dem splitten frage ich die Länge des Arrays ab und lasse die Schleife bis > 0 laufen.


Vielen Dank für die ganzen Tipps!

P.S: hier noch der funktionierende Code 🙂

Java:
	public static void main(String[] args)
	throws IOException
	{
		
		
		Writer schreib = null;
		
		schreib = new FileWriter( "xxx.txt", true); 
		
		int a = -1;
		
		

		System.out.println("Buchstaben eingeben, buchstabenweise getrennt mit -");

		BufferedReader ein = new BufferedReader(new InputStreamReader(System.in));
	
		
		
		String kompleing = null;
		
		kompleing = ein.readLine();
		
		
		
		String[] splitted = kompleing.split("-");
		
		int lange = Array.getLength(splitted);
		
		
		
		while (lange > 0)
		 {
			
			a++;
			
			lange--;
			
			String buchstabe = splitted[a];
	
			
			if(buchstabe.equals("a"))
			{
				try 
					{
						schreib.write("aAaAa-");
					}
			
			
				catch ( IOException e )
					{ 
						System.err.println( "Konnte Zeile nicht schreiben..." ); 
					} 
			}
				
			
			
			else if(buchstabe.equals("b"))
			{
				try 
					{
						schreib.write("bBbBb-");
					}
				
				
				catch ( IOException e )
					{ 
						System.err.println( "Konnte Zeile nicht schreiben..." ); 
					} 
			}
			
			
			
		}
		
		schreib.close();
		System.out.println("Datei wurde erstellt");
			
	}
 
Die Schleife ist ziemlich umständlich konstruiert.
Das Identische kannst du auch so erreichen:
Java:
public static void main(String[] args)
    throws IOException
    {
        Writer schreib = new FileWriter( "xxx.txt", true); 
        
        System.out.println("Buchstaben eingeben, buchstabenweise getrennt mit -");
        BufferedReader ein = new BufferedReader(new InputStreamReader(System.in));
        
        String kompleing = ein.readLine();

        for (String buchstabe:kompleing.split("-"))  {
            if(buchstabe.equals("a"))
            {
                try {
                        schreib.write("aAaAa-");
                } catch ( IOException e ) { 
                        System.err.println( "Konnte Zeile nicht schreiben..." ); 
                } 
            }
            else if(buchstabe.equals("b"))
            {
                try {
                        schreib.write("bBbBb-");
                } catch ( IOException e ) { 
                        System.err.println( "Konnte Zeile nicht schreiben..." ); 
                } 
            }
        }
        
        schreib.close();
        System.out.println("Datei wurde erstellt");
            
    }

Und dann bleiben noch die Fragen:
Warum mit '-' trennen?
Was, wenn der Benutzer nicht trennt?
Aus den obigen Tipps kannst du viel lernen. Nimm sie dir zu Herzen!

Vorschlag:
Java:
public static void main(String[] args)
    throws IOException
    {
        Writer schreib = new FileWriter( "xxx.txt", true); 
        
        System.out.println("Beliebigen Texte eingeben:");
        Scanner scan = new Scanner(System.in);
        String komplEing = scan.nextLine();

        for (char buchstabe:komplEing.toCharArray)  {
            for (int teste=0;teste<26;teste++) {  //=a-z; oder nur <2 wenn du nur a-b willst
                char kZeichen=(char)('a'+teste);
                if( buchstabe==kZeichen) {
                    try {
                           char gZeichen=(char)('A'+teste);
                           schreib.write(""+ kZeichen+gZeichen+kZeichen+gZeichen+kZeichen+"-");
                    } catch ( IOException e ) { 
                           System.err.println( "Konnte Zeile nicht schreiben..." ); 
                    } 
                }
            }
        }
        schreib.close();
        System.out.println("Datei wurde erstellt");
    }
Wenn du's auch nicht verwendest, so lies es dir doch durch, und denke mit, was in der jeweiligen Zeile passiert.
 
Die Schleife ist ziemlich umständlich konstruiert.
Das Identische kannst du auch so erreichen:
Java:
......
        for (String buchstabe:kompleing.split("-"))  {
            if(buchstabe.equals("a"))
            {
                try {
                        schreib.write("aAaAa-");
                } catch ( IOException e ) { 
                        System.err.println( "Konnte Zeile nicht schreiben..." ); 
                } 
            }
            else if(buchstabe.equals("b"))
  ......
    }

Die Schleife fragt dann auch Buchstabe für Buchstabe ab?

Weil ich noch String buchstabe = splitted[a]; a++; benutze, um mit jeder Schleife den Int-Wert um 1 erhöhe und somit mit jeder Schleife einen weiteren Buchstabe in die txt-Datei hinzufüge.

Die Schleife ist ziemlich umständlich konstruiert.
Das Identische kannst du auch so erreichen:
Warum mit '-' trennen?
Was, wenn der Benutzer nicht trennt?
Aus den obigen Tipps kannst du viel lernen. Nimm sie dir zu Herzen!

Danke für den/die Tipp(s), ich setze mich das nächste mal ran und versuche, den Stirng buchstabenweise zu teilen ohne vom Benutzer ein "-" für die Trennung zu fordern.
 
Java:
for (String buchstabe:kompleing.split("-"))
Die Schleife fragt dann auch Buchstabe für Buchstabe ab?

Weil ich noch String buchstabe = splitted[a]; a++; benutze, um mit jeder Schleife den Int-Wert um 1 erhöhe und somit mit jeder Schleife einen weiteren Buchstabe in die txt-Datei hinzufüge.

Ja, die forEach-Schleife ist eine elegante, verkürzte Form, die ohne Hilfsvariable auskommt.

Code:
for (String buchstabe:kompleing.split("-"))
bedeutet das selbe, wie:
Java:
  String buchstaben[]=kompleing.split("-");
  for (i=0;i<buchstaben.length();i++)  {
     buchstabe=buchstaben[i];

Wobei ich nochmal betonen möchte, dass deine Bezeichnung buchstabe trügerisch ist, weil es je nach Eingabe (z.B. ohne '-') eben gleich mehrere Buchstaben sein können!, also solltest du eher den Ausdruck
Code:
silbe
verwenden, und hoffen, dass jede Silbe nur aus 1 Buchstaben besteht!!
 

Zurück
Oben