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)
);
}
}
}
}
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;
}
}
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)
);
}
}
}
}
Als IDE brauche ich Intellji Ultimate.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.
for (int i = 0; i < 2; i++) {
System.out.println("a");
System.err.println("b");
System.out.println("c");
}
Übersetzt für @osion:Das dürfte an der Ausgabe von IntelliJ liegen, die intern den Error-Stream noch mal buffert.
Kann ich das beheben?Ü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!
Einfach nicht über IntelliJ ausführen, sondern exportieren und direkt übers Terminal startenKann ich das beheben?