Programm ignoriert in der Ausführung Code

tomzen

Mitglied
Hallo, ich habe den folgenden Code aus einem Buch abgeschrieben und das Programm ignoriert Teile des Codes wenn ich es ausführe. Es wird keine Fehlermeldung ausgegeben.

Java:
package notizen;
import java.io.*;
import javax.swing.JOptionPane;

public class Uebung13 {

    public static void main(String[] args) {
        try {
            BufferedWriter bw = new BufferedWriter(new FileWriter ("Notizen.txt", true));
            int weiter = 0;
            InputStreamReader isr = new InputStreamReader(System.in);
            BufferedReader br = new BufferedReader(isr);
            String eingabe;
            while(weiter == 0) {
                System.out.print("Geben Sie Ihre Notiz ein: ");
                eingabe = br.readLine();
                bw.write(eingabe+ "\n");
                weiter = JOptionPane.showConfirmDialog(null,
                "Möchten Sie eine weitere Notiz eingeben?", "Bestätigung", JOptionPane.YES_NO_OPTION);

            }
            bw.close();
            }
        catch(IOException ausnahme) {
            System.out.print("Fehler beim Öffnen der Datei");
            }
    }

}

Ich glaube das Problem ist das in Zeile 18 kein Wert an die Variable "weiter" übergeben wird. Das ist aber notwendig um der while Schleife mitzuteilen wie es weitergehen soll. Was sagt ihr zu dem code? Kann das überhaupt funktionieren? Ich verwende Eclipse als IDE und habe bisher nach Hilfe unter dem Stichwort JOptionPane.showConfirmDialog gesucht.
 
Zuletzt bearbeitet:
Ich verwende Eclipse als IDE
Es kann sein, dass Eclipse alten Code ausführt, z. B. wenn sich bei einer Änderung ein Fehler eingeschlichen hat.

Was sagt ihr zu dem code?
Der Vergleich mit 0 ist nicht gut. Ich würde an der Stelle mit JOptionPane.YES_OPTION vergleichen, außerdem bietet sich hier eine do-while-Schleife an.

Java:
do {
// ...
} while (weiter == JOptionPane.YES_OPTION);

EDIT: ach, und dann hätten wir noch ein paar weitere Anmerkungen...

1. verwende try-with-resources:

Java:
try (BufferedWriter bw = new BufferedWriter(new FileWriter ("Notizen.txt", true))) {
...
}
Dann brauchst Du das bw.close() nicht und die Datei wird auch im Fehlerfall korrekt geschlossen.

2. die Variable eingabe sollte in der Schleife deklariert werden, da sie außerhalb nirgends verwendet wird, also einfach
Java:
String eingabe = br.readLine();
 
Wieso glaubst du das eine Fehlermeldung ausgegeben werden sollte?
Ich dachte das ein fehlerhafter Code vorliegt, weil das Programm nicht nachfragt ob eine weitere Notiz eingegeben werden soll.
Ich habe den Code verändert:

Java:
package notizen;
import java.io.*;
import javax.swing.JOptionPane;

public class Uebung13 {

    public static void main(String[] args) {
        try (BufferedWriter bw = new BufferedWriter(new FileWriter ("Notizen.txt", true))){
           
            int weiter = 0;
            InputStreamReader isr = new InputStreamReader(System.in);
            BufferedReader br = new BufferedReader(isr);
           
            do{
                
                System.out.print("Geben Sie Ihre Notiz ein: ");
                String eingabe = br.readLine();
                bw.write(eingabe+ "\n");
               
            } while (weiter == JOptionPane.YES_OPTION);
           
            }
        catch(IOException ausnahme) {
            System.out.print("Fehler beim Öffnen der Datei");
            }
    }

}

Das Programm nimmt jetzt die Eingaben auf aber die Option ob eine weitere Eingabe erfolgen soll erfolgt immer noch nicht.
 
Hallo, ich habe den folgenden Code aus einem Buch abgeschrieben und das Programm ignoriert Teile des Codes wenn ich es ausführe. Es wird keine Fehlermeldung ausgegeben.
Das Problem tritt mit diesem Code unter Eclipse tatsächlich auf. Der Grund dafür ist aber nicht die Logik im Code. Das Problem ergibt sich aus der Tatsache, dass Swingkomponenten nicht unbedingt threadsicher sind. Das gilt auch für JOptionpane. Im konkreten Fall wird auf meinem System ( Win10 Eclipse Java 8 ) der Code zwar korrekt aufgerufen aber das Fenster von JOptionPane wird nicht angezeigt. Ich nehme an, dass das bei dir auch der Fall ist. Die Lösung ist hier invokelater(). Das hat bei mir das Fenster wie gewünscht mit diesem Code angezeigt.
Bei der zweiten Eingabe allerdings wurde die JOptionpane wieder nicht angezeigt. Ich konnte das dadurch beheben indem ich das Schließen des geöffneten Files in einen finally Block ausgelagert habe.
Mit diesen beiden Anpassungen funktioniert jetzt der Code aber wie gewünscht.

Java:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;

import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;

public class Uebung13 {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                doNotesInput();
            }
        });
    }

    private static void doNotesInput() {
        BufferedWriter bw = null;
        try {
            bw = new BufferedWriter(new FileWriter("Notizen.txt", true));
            int weiter = JOptionPane.YES_OPTION;
            InputStreamReader isr = new InputStreamReader(System.in);
            BufferedReader br = new BufferedReader(isr);
            String eingabe;
            while (weiter == JOptionPane.YES_OPTION) {
                System.out.println("Notiz eingeben: ");
                eingabe = br.readLine();
                bw.write(eingabe + "\n");
                weiter = JOptionPane.showConfirmDialog(null, "Möchten Sie eine weitere Notiz eingeben?", "Bestätigung",
                        JOptionPane.YES_NO_OPTION);
            }
            System.out.println("Ende der Notiz Eingabe!");
        } catch (IOException ausnahme) {
            System.out.print("Fehler beim Öffnen der Datei");
        } finally {
            if (bw != null)
                try {
                    bw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }
    }
}
 

Neue Themen


Zurück
Oben