Ein- Ausgabe/ Fehlerbehandlung

Wirtschaftsinformatiker

Bekanntes Mitglied
Kann jemand mir sagen, wie ich meinen code mit diese zwei Dateien testen, ob den code die Dateirn liest 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
Screenshot_20230408_154214_Microsoft 365 (Office).jpg
zahlen_2.txt

Screenshot_20230408_154315_Microsoft 365 (Office).jpg

Meinen geschriebenen Code:
Java:
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;

// Eine Klasse, die von InputStream abgeleitet wird, um eine Datei mit Zahlen im Bereich von 0..255 einzulesen
public class NumberInputStream extends InputStream {

    // Eine Reader-Instanz, die zum Lesen der Zahlen aus der Datei verwendet wird
    private Reader reader;

    // Ein Konstruktor, der einen Reader als Parameter erhält
    public NumberInputStream(Reader reader) {
        this.reader = reader;
    }

    // Überschreiben der read()-Methode von InputStream
    @Override
    public int read() throws IOException {
        // Eine Variable, die den gelesenen Integer-Wert speichert
        int value = 0;
        // Liest das nächste Zeichen aus dem Reader
        int currentChar = reader.read();

        // Solange das gelesene Zeichen eine Ziffer ist und nicht ein Leerzeichen oder ein Zeilenumbruch ist
        while (currentChar >= 0 && currentChar != ' ' && currentChar != '\n' && currentChar != '\r') {
            // Wenn das Zeichen keine Ziffer ist
            if (currentChar < '0' || currentChar > '9') {
                // Wirft eine Ausnahme, da das Zeichen keine Ziffer ist
                throw new NumberFormatException("keine Ziffer");
            }
            // Konvertiert die gelesenen Ziffern in eine Zahl
            while (currentChar >= '0' && currentChar <= '9') { // Schleife, die solange läuft, wie das nächste gelesene Zeichen eine Ziffer ist
                value *= 10; // multipliziert "value" mit 10, um Platz für die nächste Ziffer zu schaffen
                value += currentChar - '0'; // konvertiert die nächste Ziffer von ASCII zu einer Ganzzahl und addiert sie zu "value"
                currentChar = reader.read(); // liest das nächste Zeichen
            }

            // Wenn die gelesene Zahl größer als 255 ist, wirft eine Ausnahme
            if (value > 255) {
                throw new NumberToLargeException("Zahl größer als 255");
            }
        }
        // Wenn das letzte gelesene Zeichen ein Zeilenumbruch ist, liest das nächste Zeichen
        if (currentChar == '\n' ) {
            currentChar = reader.read();
        }
        // Gibt die gelesene Zahl als Integer zurück
        if (value >= 0) {
            return value;
        } else {
            return -1;
        }
    }

    // Eine benutzerdefinierte Ausnahme, die geworfen wird, wenn eine Zahl größer als 255 gefunden wird
    public static class NumberToLargeException extends IOException {
        public NumberToLargeException(String message) {
            super(message);
        }
    }
}
 

Anhänge

  • Screenshot_20230408_154315_Microsoft 365 (Office).jpg
    Screenshot_20230408_154315_Microsoft 365 (Office).jpg
    12,8 KB · Aufrufe: 0
Zuletzt bearbeitet:

Marinek

Bekanntes Mitglied
Grundsätzlich solltest du eine Instanz der Klasse erstellen und dann die Methode read() darauf ausführen:

Java:
public static void main (String args[]) {
     File file = new File("fileTest.txt");
    FileInputStream inputStream = new FileInputStream(file);   
    
    NumberInputStream numberInputStream = new NumberInputStream(inputStream);
    
    numberInputStream.read(); // Man müsste es mehrfach natürlich aufrufen z.B. in einer Schleife.
}

Der Quellcode ist ja Zeile für Zeile kommentiert und er lässt sich kompilieren. Ich gehe davon aus, dass du ihn nicht geschrieben hast. Ich schlage vor den Urheber zu fragen, ob der Quellcode das tut, was du machen möchtest.

Bereits die letzten Antworten in diesem Thread und in anderen, die du gestellt hast, zeigen, dass man deinen Einsatz die Dinge zu verstehen und den Einsatz der Leute, die hier für dich prüfen sollen, ob ein Stück Code funktioniert oder nicht in keinem Verhältniss steht.

Du könntest zumindest so tun, als ob du dir Mühe gemacht hast hier ein Posting abzusetzen. Sorry, aber das hat ja nichts mit können zu tun. Und das Forum ist nicht dazu da DEINE Arbeit zu machen, sondern dir zu HELFEN deine Arbeit zu machen. Das ist ein großer Unterschied.

Ich sage das mal so direkt, weil die Anspielungen aus dem letzten Thread scheintst du nicht verstanden zu haben.

DU MUSST MEHR LEISTEN!
 

Jw456

Top Contributor
Hallo

Schaue prüfe teste doch mal was deine zwei While Schleifen machen.
Wann sind die beiden Schleifen beendet?
Nach der ersten Zahl oder nach der ganzen Datei?

Stimmt das mit deiner Aufgabenstellung überein?
Die read()-Methode Ihrer NumberInputStream-Klasse soll die in der Textdatei als ASCIIZiffern enthaltenen Zahlen kodiert als Integer zurückgeben.

Wieviel soll in der Aufgabe gelesen werden? Eine Zahl oder gleich die ganze Datei?

Was macht die read Methode in der Klasse InputStream? Wieviel liest die?
 
Zuletzt bearbeitet:
Naja wäre der Code korrekt, würde er uns jetzt nicht fragen. XD
Er meint ob er einen Fehler gemacht hat bei der Nutzung der Schleifen, der Funktionen und Variablen.
Dein Code ist erstmal grundlegend richtig eingesetzt, kann aber so nicht verwendet werden.
Erstmal wechsel bitte zu IntelliJ, oder Eclipse. Sich den Stuff von BlueJ vorschreiben zu lassen, macht dich nur leistungsschwach. ((Jaja ich weiß low-code und so,) aber erst wenn man auch die Befehle versteht.

Dann setz den Code und die Textdatei ein und sag an was der macht und dann erklären wir dir gerne warum ;-)
 

Marinek

Bekanntes Mitglied
Dein Code ist erstmal grundlegend richtig eingesetzt, kann aber so nicht verwendet werden.

Was bedeutet das?
Erstmal wechsel bitte zu IntelliJ, oder Eclipse. Sich den Stuff von BlueJ vorschreiben zu lassen, macht dich nur leistungsschwach. ((Jaja ich weiß low-code und so,) aber erst wenn man auch die Befehle versteht.


Finde einem Anfänger IntelliJ vor die Füße zu werfen und sagen "mach mal das" vs. er kann eine einfache Klasse nicht korrekt einsetzen, ist weit em Thema vorbei.
 
Was bedeutet das?
Naja, der Code tut was er soll.

einfaches beispiel:
For-Schleife mit ++ auszustatten sorgt dafür das diese läuft, aber reicht allein nicht um ein Array zu initialisieren.
Sry habs umständlich ausgedrückt.

einem Anfänger IntelliJ vor die Füße zu werfen
Mag gemein sein, aber lieber direkt richtig, als immer falsch. Außerdem ist ja auch Eclipse von mir vorgeschlagen worden(und auch angemessen begründet worden).

Aber ja du hast recht... der Post war wirklich nur bedingt hilfreich.
Du könntest zumindest so tun, als ob du dir Mühe gemacht hast hier ein Posting abzusetzen. Sorry, aber das hat ja nichts mit können zu tun. Und das Forum ist nicht dazu da DEINE Arbeit zu machen, sondern dir zu HELFEN deine Arbeit zu machen. Das ist ein großer Unterschied.
Hab mich da einfach von dem oberen Post mit rein reiten lassen.... Hätte nicht passieren dürfen :-/
 

Marinek

Bekanntes Mitglied
einfaches beispiel:
For-Schleife mit ++ auszustatten sorgt dafür das diese läuft, aber reicht allein nicht um ein Array zu initialisieren.
Sry habs umständlich ausgedrückt
Sorry. Da habe ich mich wohl falsch ausgedrückt. Was hat deine Aussage mit dem vorliegenden code zu tun.

Es kommt keine for Schleife darin vor.

Der Vorschlag eine ide zu verwenden ist hier unpassend.
 

KonradN

Super-Moderator
Mitarbeiter
Da will ich dann doch auch einmal meine Sichtweise abgeben:

a) Das Problem mit der Frage ist, dass der TE natürlich ein Problem mit dem Code hat, aber warum sollen wir das Problem erraten? Man kann doch schreiben, was geht bzw. was nicht geht. Oder ob es ihm nur darum geht, ob der Code so auch Clean Code Ansprüchen genügt oder nicht. Das ist alles schlicht nicht gegeben und das ist nervig.

b) Jetzt müssen wir raten, wo das Problem ist? Ich denke, das Problem ist die Behandlung der Trennzeichen. Warum wird bei einem Zeilenumbruch noch ein weiteres Zeichen eingelesen? Damit wird das folgende Zeichen ignoriert und das funktioniert nur, wenn nach dem \n noch ein weiteres Zeichen kommt, das keine Ziffer ist!

c) ein weiteres Problem ist ggf. das Vorhandensein von mehreren Trennzeichen. Also was ist, wenn zwei Leerzeichen vorhanden sind? Soll dieser Fall legitim sein? Spätestens der Windows Zeilenumbruch ist hier zu nennen mit dem \r\n - aber evtl. war die Idee aus b), dass man \r behandelt? Also man trifft die (in meinen Augen nicht legitime) Annahme, dass nach einem \r noch ein \n kommen wird und das wird einfach an der Stelle gelesen? (Sprich: Aus dem \n müsste dort ein \r werden)

d) Was ist mit dem Einlesen der Zahl 0? Dann ist der Wert natürlich 0 und bei Wert = 0 wird -1 zurück gegeben. Das ist also auf jeden Fall ein Problem.

==> Hier kann man nur immer wieder den Tipp geben: Bitte sauber formulieren! Wie ist das genau vorgehen? Wie Leute darauf kommen, dass sie etwas programmieren können, bei dem sie den Ablauf nicht kennen bzw. schlicht nicht überblicken, werde ich nie verstehen. Das führt doch zu einem raten. Irgendwie wurde irgendwas gemacht. Das macht nicht, was es soll. Aber da man den Ablauf nie durchdacht hat, hat man dann irgendwas an Code, das man auch nicht mehr versteht. Und daran ändert man dann nach dem Zufallsprinzip irgendwas und hofft auf ein Wunder.
(Sorry, wenn das negativ klingt. Aber nicht ohne Grund geben wir das Vorgehen oft genug hier im Forum doch weiter und auch der TE wird das bestimmt schon das eine oder andere Mal gesagt bekommen haben!)

Also:
1. Überlege Dir das Vorgehen genau! Nimm Stift und Papier und spiele es durch. Fang mit dem positiven Fall an - also ohne Fehler. Was sind die Schritte, die durchgegangen werden müssen?
2. Dann spiel die Grenzfälle durch. Was ist beim Ende? Oder der leeren Datei? Oder der 0.
3. Dann spiel Fehlerfälle durch: Nicht erlaubte Ziffern an unterschiedlichen Stellen. Zahlen > 255

Wenn der Algorithmus, den Du Dir mit Stift und Papier überlegt hast, funktioniert, dann kannst Du diesen in Code umsetzen. Und dabei wirst Du hoffentlich eine vernünftige Unterteilung haben! Dann wird der Code auch lesbar. Und dann kannst Du Deinen eigenen Code verstehen!

Das als Antwort zum TE. Aber ein Punkt ist da noch, zu dem ich auch etwas sagen möchte:
Erstmal wechsel bitte zu IntelliJ, oder Eclipse.
Der TE hat auch NetBeans erwähnt. Also zu BlueJ kann gerne jeder meinen was er will, aber damit hat er eine der drei großen Java IDEs genannt.

Und bei einem Anfänger Eclipse zu bringen ist in meinen Augen fahrlässig. Da kommt jemand mit einfachen Dingen noch nicht klar und dann wollen wir ihm direkt diese IDE vorwerfen? Eclipse ist überkompliziert und verwirrt Anfänger direkt von Anfang an mit unverständlichen Meldungen (z.B. Wechsel der Perspektive - ja, tolle IDE aber ein Anfänger verwirrt das doch!) und schlechten Voreinstellungen (awt ausblenden? Als ich das bei einem Thread hier das erste Mal gesehen hatte, da war mir klar: Eclipse Bashing ist in einem Forum, in dem vor allem Anfänger Fragen stellen, mehr wie angesagt!) Also definitiv lieber einem Anfänger BlueJ als Eclipse an die Hand geben!

Aber ja - IntelliJ oder NetBeans ist für Anfänger auch das, was ich empfehlen würde.
 

Neue Themen


Oben