System.out.println wird nicht ausgegeben?

osion

Bekanntes Mitglied
Hallo

Ich habe folgendes Problem
1636674372208.png
Wenn ich ein Error über System.err.println(msg) ausgebe, dann erscheint mein System.out.println nicht mehr. Ich lasse alles in einer Schleife laufen. Hat jemand eine Idee warum das so ist?
 
Die Ausgabe funktioniert nur nicht, wenn ein Fehler ausgegeben wurde.

Java:
package de.klaus;

import java.util.HashMap;
import java.util.Map;

public class Main {

    public static void main(String[] args) {
        PrintSettings printSettingsDefault = new PrintSettings(0, true);
        Text text = new Text(printSettingsDefault);
        ConsolePrinter consolePrinter = new ConsolePrinter();
        InputReader inputReader = new InputReader();
        Commands commands = new Commands(text, consolePrinter, inputReader);
        Map<Integer, String> errorMessagesMap = new HashMap<>();
        ErrorMessages errorMessages = new ErrorMessages(errorMessagesMap, "Unbekanntes Problem");
        BuilderTextPrint builderTextPrint = new BuilderTextPrint();

        errorMessagesMap.put(0, "Kommand wurde erfolgreich ausgeführt.");
        errorMessagesMap.put(1, "Kein Kommando für die Eingabe gefunden.");
        errorMessagesMap.put(2, "Es wurde keine Eingabe getätigt.");
        errorMessagesMap.put(50, "Die Paragraf Nummer muss mindestens 1 sein.");
        errorMessagesMap.put(51, "Die Paragraf Nummer ist zu hoch. ");
        errorMessagesMap.put(52, "Der Befehl muss in Grossbuchstaben sein.");
        errorMessagesMap.put(100, "Die Paragraf Nummer muss mindestens 1 sein.");
        errorMessagesMap.put(101, "Es wurde kein vorheriger Paragraf gefunden, welche mit der angegebene Paragrafen-Nummer zusammenpasst.");
        errorMessagesMap.put(102, "Es konnte kein Paragraf gelöscht werden, weil der Text kein Paragraf enthält.");
        errorMessagesMap.put(150, "Die Paragraf Nummer muss mindestens 1 sein.");
        errorMessagesMap.put(151, "Es wurde kein vorheriger Paragraf gefunden, welche mit der angegebene Paragrafen-Nummer zusammenpasst.");
        errorMessagesMap.put(300, "Der Wert für die maximale Zeichenanzahl muss mindestens 1 sein.");
        errorMessagesMap.put(451, "Die Paragraf Nummer muss mindestens 1 sein.");
        errorMessagesMap.put(452, "Paragraf wurde nicht gefunden");
        errorMessagesMap.put(453, "Das Suchfeld darf nicht leer sein.");

        int resultCode = 2;
        String userInput;
        while (true) {
            System.out.print("Bitte Kommando Eingeben: ");
            userInput = inputReader.readInput();
            if (!userInput.trim().equals("")) {
                resultCode = commands.commandAdd(userInput);
                if (resultCode == 0) {
                    consolePrinter.print(errorMessages
                                    .getErrorMessage(
                                            resultCode),
                            true
                    );
                    continue;
                } else if (resultCode > 1) {
                    consolePrinter.printError(
                            errorMessages.getErrorMessage(resultCode)
                    );
                    continue;
                }

                //Kommando: DEL
                resultCode = commands.commandDel(userInput);
                if (resultCode == 0) {
                    consolePrinter.print(errorMessages
                                    .getErrorMessage(
                                            resultCode),
                            true
                    );
                    continue;
                } else if (resultCode > 1) {
                    consolePrinter.printError(
                            errorMessages.getErrorMessage(resultCode)
                    );
                    continue;
                }

                //Kommando: DUMMY
                resultCode = commands.commandDummy(userInput);
                if (resultCode == 0) {
                    consolePrinter.print(errorMessages
                                    .getErrorMessage(
                                            resultCode),
                            true
                    );
                    continue;
                } else if (resultCode > 1) {
                    consolePrinter.printError(
                            errorMessages.getErrorMessage(resultCode)
                    );
                    continue;
                }

                //Kommando: FORMAT RAW
                resultCode = commands.commandFormatRaw(userInput);
                if (resultCode == 0) {
                    consolePrinter.print(errorMessages
                                    .getErrorMessage(
                                            resultCode),
                            true
                    );
                    continue;
                } else if (resultCode > 1) {
                    consolePrinter.printError(
                            errorMessages.getErrorMessage(resultCode)
                    );
                    continue;
                }

                //Kommando: FORMAT FIX
                resultCode = commands.commandFormatFix(userInput);
                if (resultCode == 0) {
                    consolePrinter.print(errorMessages
                                    .getErrorMessage(
                                            resultCode),
                            true
                    );
                    continue;
                } else if (resultCode > 1) {
                    consolePrinter.printError(
                            errorMessages.getErrorMessage(resultCode)
                    );
                    continue;
                }

                //Kommando: INDEX
                resultCode = commands.commandIndex(userInput,
                        consolePrinter
                );
                if (resultCode == 0) {
                    consolePrinter.print(errorMessages
                                    .getErrorMessage(
                                            resultCode),
                            true
                    );
                    continue;
                } else if (resultCode > 1) {
                    consolePrinter.printError(
                            errorMessages.getErrorMessage(resultCode)
                    );
                    continue;
                }

                //Kommando: PRINT
                resultCode = commands.commandPrint(
                        userInput,
                        consolePrinter,
                        builderTextPrint
                );
                if (resultCode == 0) {
                    consolePrinter.print(errorMessages
                                    .getErrorMessage(
                                            resultCode),
                            true
                    );
                    continue;
                } else if (resultCode > 1) {
                    consolePrinter.printError(
                            errorMessages.getErrorMessage(resultCode)
                    );
                    continue;
                }

                //Kommando: Replace
                resultCode = commands.commandReplace(userInput);
                if (resultCode == 0) {
                    consolePrinter.print(errorMessages
                                    .getErrorMessage(
                                            resultCode),
                            true
                    );
                    continue;
                } else if (resultCode > 1) {
                    consolePrinter.printError(
                            errorMessages.getErrorMessage(resultCode)
                    );
                    continue;
                }

                //Kommando: Exit
                resultCode = commands.commandExit(userInput);
                if (resultCode == 0) {
                    consolePrinter.print(errorMessages
                                    .getErrorMessage(
                                            resultCode),
                            true
                    );
                    continue;
                } else if (resultCode > 1) {
                    consolePrinter.printError(
                            errorMessages.getErrorMessage(resultCode)
                    );
                    continue;
                }

                consolePrinter.printError(
                        errorMessages.getErrorMessage(1)
                );

            } else {
                consolePrinter.printError(
                        errorMessages
                                .getErrorMessage(
                                        resultCode)
                );
            }
        }
    }
}

Und die Klasse für die Ausgabe:

Java:
package de.klaus;

import java.util.ArrayList;
import java.util.List;

/**
 * Die Klasse ist für die Ausgabe in der Konsole verantwortlich. Dabei kann eine normale Nachricht ausgegeben werden und
 * eine Fehlermeldung.
 *
 * @author rohreluc
 * @version 1.0
 * @since 01.11.21
 */
public class ConsolePrinter {

    private final List<String> logOutput = new ArrayList<>();
    private final boolean testMode;

    /**
     * Dieser Konstruktor ermöglicht es, dass für Testzwecke die Ausgabe gespeichert werden.
     *
     * @param testMode Bei true ist der Testmodus für die Aufzeichnung der Ausgabe aktiviert
     * @since 2.11.21
     */
    public ConsolePrinter(boolean testMode) {
        this.testMode = testMode;
    }

    /**
     * Parameterloser Konstruktor, welche aufgerufen wird, wenn kein Test-Modus eingestellt werden soll.
     *
     * @since 01.11.21
     */
    public ConsolePrinter() {
        this(false);
    }

    /**
     * Die Funktion gibt eine Nachricht per System.out.println in der Konsole aus.
     *
     * @param msg Nachricht die ausgegeben werden soll
     * @since 01.11.21
     */
    public void print(String msg,boolean newLine) {
        if (testMode) {
            logOutput.add(msg);
        }
        if(newLine){
            System.out.println(msg);
        }else{
            System.out.print(msg);
        }
    }

    /**
     * Die Funktion gibt eine Nachricht per system.err.println in der Konsole aus.
     *
     * @param msg Nachricht die ausgegeben werden soll
     * @since 01.11.21
     */
    public void printError(String msg) {
        if (testMode) {
            logOutput.add(msg);
        }
        System.err.println(msg);
    }

    /**
     * Nur bei aktivierten Testmodus werden die Nachrichten für die Konsole gespeichert.
     *
     * @return Alle gespeicherte Nachrichten
     * @since 02.11.21
     */
    public List<String> getLogOutput() {
        return logOutput;
    }
}
 
Dein Code ist nicht gerade leserlich und es fehlt auch noch was.
Deswegen kann ich nur raten:
Nirgendwo wird auf eine negative Zahlen getestet . Deswegen ist eine Vermutung dass resultCode auf einen negativen Wert gesetzt wird und du in einem Endlos loop bist.
 
Kann es sein, dass die Eingabe / Ausgabe nur verdreht ist und er da halt gerade auf eine neue Eingabe wartet?

Vor der Fehlermelsung steht ja schon wieder die Aufforderung, ein neues Kommando einzugeben.
 
Also im Augenblick kann ich das Verhalten nicht erklären, denn es gibt keine Nebenläufigkeit.

System.err hat ein Automatisches Flush (Im Gegensatz zu System.out). Daher wäre ein genau umgedrehtes Verhalten denkbar: Dass die Error Ausgabe nach der Standard Ausgabe gemacht wird und dennoch vor der Standard Ausgabe erscheint.

Im Augenblick könnte ich mir nur vorstellen, dass dies ein Thema der IDE ist, die ja die Ausgabe-Streams des Prozesses ausliest und dann im Fenster anzeigt.
 
Ich habe den Code für die Übersicht angepasst das Problem existiert immer noch (FORMAT FIX UND FORMAT RAW stimmt hier noch nicht ganz, aber ist nur zum zeigen):
Java:
package ch.osion;

import java.util.HashMap;
import java.util.Map;

public class Main {

    public static void main(String[] args) {
        PrintSettings printSettingsDefault = new PrintSettings(0, true);
        Text text = new Text(printSettingsDefault);
        ConsolePrinter consolePrinter = new ConsolePrinter();
        InputReader inputReader = new InputReader();
        Commands commands = new Commands(text, consolePrinter, inputReader);
        Map<Integer, String> resultCodeMessageMap = new HashMap<>();
        ResultCodeMessages resultCodeMessages = new ResultCodeMessages(resultCodeMessageMap, "Unbekanntes Problem");
        BuilderTextPrint builderTextPrint = new BuilderTextPrint();

        resultCodeMessageMap.put(0, "Kommand wurde erfolgreich ausgeführt.");
        resultCodeMessageMap.put(1, "Kein Kommando für die Eingabe gefunden.");
        resultCodeMessageMap.put(2, "Es wurde keine Eingabe getätigt.");
        resultCodeMessageMap.put(50, "Die Paragraf Nummer muss mindestens 1 sein.");
        resultCodeMessageMap.put(51, "Die Paragraf Nummer ist zu hoch. ");
        resultCodeMessageMap.put(52, "Der Befehl muss in Grossbuchstaben sein.");
        resultCodeMessageMap.put(100, "Die Paragraf Nummer muss mindestens 1 sein.");
        resultCodeMessageMap.put(101, "Es wurde kein vorheriger Paragraf gefunden, welche mit der angegebene Paragrafen-Nummer zusammenpasst.");
        resultCodeMessageMap.put(102, "Es konnte kein Paragraf gelöscht werden, weil der Text kein Paragraf enthält.");
        resultCodeMessageMap.put(150, "Die Paragraf Nummer muss mindestens 1 sein.");
        resultCodeMessageMap.put(151, "Es wurde kein vorheriger Paragraf gefunden, welche mit der angegebene Paragrafen-Nummer zusammenpasst.");
        resultCodeMessageMap.put(300, "Der Wert für die maximale Zeichenanzahl muss mindestens 1 sein.");
        resultCodeMessageMap.put(451, "Die Paragraf Nummer muss mindestens 1 sein.");
        resultCodeMessageMap.put(452, "Paragraf wurde nicht gefunden");
        resultCodeMessageMap.put(453, "Das Suchfeld darf nicht leer sein.");
        resultCodeMessageMap.put(454, "Der Text enthält noch kein Paragraf.");

        int resultCode;
        String userInput;
        while (true) {
            consolePrinter.print("Bitte Kommando Eingeben: ", false);
            userInput = inputReader.readInput();

            switch (userInput.split(" ")[0]) {
                case "":
                    resultCode = 2;
                    break;
                case "ADD":
                    resultCode = commands.commandAdd(userInput);
                    break;
                case "DEL":
                    resultCode = commands.commandDel(userInput);
                    break;
                case "DUMMY":
                    resultCode = commands.commandDummy(userInput);
                    break;
                case "FORMAT RAW":
                    resultCode = commands.commandFormatRaw(userInput);
                    break;
                case "FORMAT FIX":
                    resultCode = commands.commandFormatFix(userInput);
                    break;
                case "INDEX":
                    resultCode = commands.commandIndex(userInput,
                            consolePrinter
                    );
                    break;
                case "PRINT":
                    resultCode = commands.commandPrint(
                            userInput,
                            consolePrinter,
                            builderTextPrint);
                    break;
                case "REPLACE":
                    resultCode = commands.commandReplace(userInput);
                    break;
                case "EXIT":
                    resultCode = commands.commandExit(userInput);
                    break;
                default:
                    resultCode = 1;
                    break;
            }

            if (resultCode == 0) {
                consolePrinter.print(
                        resultCodeMessages.getMessage(resultCode),
                        true
                );
            } else {
                consolePrinter.printError(
                        resultCodeMessages.getMessage(resultCode)
                );
            }
        }
    }
}

Also im Augenblick kann ich das Verhalten nicht erklären, denn es gibt keine Nebenläufigkeit.

System.err hat ein Automatisches Flush (Im Gegensatz zu System.out). Daher wäre ein genau umgedrehtes Verhalten denkbar: Dass die Error Ausgabe nach der Standard Ausgabe gemacht wird und dennoch vor der Standard Ausgabe erscheint.

Im Augenblick könnte ich mir nur vorstellen, dass dies ein Thema der IDE ist, die ja die Ausgabe-Streams des Prozesses ausliest und dann im Fenster anzeigt.
Als IDE brauche ich Intellji Ultimate.
 
Kannst Du einmal das ganze Projekt bereit stellen, so dass wir alles Klassen haben um es auch einmal selbst auszuführen? Sonst wird es sehr schwer, da etwas zu sagen.

Die neue Struktur ist aber deutlich besser. Etwas in der Art wollte ich Dir schon vorschlagen, aber hatte das aufgeschoben bis eben das eigentliche Thema erledigt ist. Sonst driftet die Diskussion hinterher ab und das eigentliche Problem geht verloren.
 
Das dürfte an der Ausgabe von IntelliJ liegen, die intern den Error-Stream noch mal buffert.

Kann man einfach testen, indem man das einmal in IntelliJ ausführt und einmal direkt mit java:

Java:
        for (int i = 0; i < 2; i++) {
            System.out.println("a");
            System.err.println("b");
            System.out.println("c");
        }
 
Das dürfte an der Ausgabe von IntelliJ liegen, die intern den Error-Stream noch mal buffert.
Übersetzt für @osion:
Dein Code ist also korrekt. Die Ausgabe ist nur eben verdreht was eine Eigenart von IntelliJ ist.

Du hast ja in der Ausgabe stehen:
Bitte Kommando eingeben: <Fehlermeldung>

Dein Programm gibt von der Reihenfolge her aber korrekt aus:
<Fehlermeldung>
Bitte Kommando eingeben:

Da dies aber über zwei unterschiedliche Streams geht, kann IntelliJ die Reihenfolge tauschen. Das mag nicht schön sein aber kein Problem von Dir!
 
Übersetzt für @osion:
Dein Code ist also korrekt. Die Ausgabe ist nur eben verdreht was eine Eigenart von IntelliJ ist.

Du hast ja in der Ausgabe stehen:
Bitte Kommando eingeben: <Fehlermeldung>

Dein Programm gibt von der Reihenfolge her aber korrekt aus:
<Fehlermeldung>
Bitte Kommando eingeben:

Da dies aber über zwei unterschiedliche Streams geht, kann IntelliJ die Reihenfolge tauschen. Das mag nicht schön sein aber kein Problem von Dir!
Kann ich das beheben?
 

Neue Themen


Zurück
Oben