Java: Ein-Ausgabe/ Fehlerbehandlung?
Kann jemand mir sagrn, wid ich meine code mig diese zwei Dateien testen, ob ddn code die Dateirn ließt oder nicht? Ich weiß nicht wie es auf Netbeans oder Bluej geht?
Ihnen liegen zwei Textdateien vor, die eine beliebige Anzahl an Zahlen im Wertebereich
von 0..255 enthält. Die einzelnen Zahlen sind durch Leerzeichen (oder Zeilenumbrüche) voneinander getrennt.
Implementieren Sie eine von java.io.InputStream abgeleitete Klasse mit Namen NumberInputStream, welche eine java.io.Reader-Instanz nutzt, um diese Datei einzulesen.
Die read()-Methode Ihrer NumberInputStream-Klasse soll die in der Textdatei als ASCIIZiffern enthaltenen Zahlen kodiert als Integer zurückgeben. Sie müssen dazu die
read()-Methode natürlich überschreiben.
Erstellen Sie zusätzlich eine NumberToLargeException-Klasse, die von der read()-Methode Ihrer NumberInputStream-Klasse geworfen wird, falls im Eingabestrom eine Zahl größer 255 enthalten ist.
zahlen_1.txt
zahlen_2.txt
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
public class NumberInputStream extends InputStream {
private Reader reader;
public NumberInputStream(Reader reader) {
this.reader = reader;
}
@Override
public int read() throws IOException {
int value = 0;
int currentChar = reader.read();
while (currentChar >= 0 && currentChar != ' ' && currentChar != '\n' && currentChar != '\r')
// Wenn das Zeichen keine Ziffer ist
if (currentChar < '0' || currentChar > '9') {
throw new NumberFormatException("keine Ziffer");
}
while (currentChar >= '0' && currentChar <= '9') {
value *= 10;
value += currentChar - '0';
currentChar = reader.read();
}
if (value > 255) {
throw new NumberToLargeException("Zahl größer als 255");
}
}
if (currentChar == '\n' ) {
currentChar = reader.read();
}
if (value >= 0) {
return value;
} else {
return -1;
}
}
public static class NumberToLargeException extends IOException {
public NumberToLargeException(String message) {
super(message);
}
}
}
1 Antwort
Du erstellst dir eine extra Klasse, in der du eine Main-Methode implementierst.
Diese Main-Methode nimmt einen String von der Commandozeile, parst diesen zu einem Pfad, erstellt einen FileReader dafür und übergibt diesen an den NumberReader, um dann die read-Methode aufzurufen und die Ausgabe auszugeben und gegebenenfals auf Korrektheit zu prüfen.
Negative Zahlen sollen evtl. auch behandelt werden?
Ansonsten müsstest du evtl. noch das Forwarding zur nächsten Zahl optimieren (unter der Annahme, dass zwischen den zahlen beliebig viele Whitespaces und nicht nur zwei beim Zeilenumbruch).
Ansonsten sieht das soweit korrekt aus.
Was meinen Sie damit "Ansonsten müsstest du evtl. noch das Forwarding zur nächsten Zahl optimieren (unter der Annahme, dass zwischen den zahlen beliebig viele Whitespaces und nicht nur zwei beim Zeilenumbruch).".Wie soll uch jetzt den Code ändern?
Es dürfen nur die Zahlen zwieschen 0 bis 255 dran kommen, wie in Aufgabe steht
Was meinen Sie damit
Nun, wenn du einen Zeilenumbruch liest, dann gehst du derzeit davon aus, dass das entweder "\r\n" oder nur "\r" oder nur "\n" ist. Was aber, wenn jetzt irgenjemand auf die Idee kommt, soetwas wie "\n\r" zu amchen oder gar Zur Trennung schlicht mehrere Whitespaces hernimmt "12 \n 13".
Den Fall würde ich abfangen, das sollte den Code schlußendlich auch einfacher machen, da der Sonderfall für den doppelten zeilenumbruch wegfällt.
Es dürfen nur die Zahlen zwieschen 0 bis 255 dran kommen, wie in Aufgabe steht
Okay, dann brauchst du negative Zahlen natürlich nicht zu behandeln.
Hab den Code richtig geschrieben? Passt es zu den Aufgaben?