1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Ascii-Reader die dritte :)

  • emptyvi
  • 29. April 2008 um 18:00
  • Unerledigt
  • emptyvi
    14
    emptyvi
    Logo 2012, Platz 2.
    Reaktionen
    102
    Punkte
    2.037
    Beiträge
    374
    • 29. April 2008 um 18:00
    • #1

    Hi!

    Nachdem ich die ersten zwei Übungsrunden in "Einführung in die Programmierung" auf der TU mehr oder weniger leicht geschafft habe (ua. dank eurer Hilfe :wave:) bin ich bei der dritten Aufgabe nun mittel bis sehr am verzweifeln. Es geht ungefähr um das selbe, wie bei den ersten zwei Beispielen: Man muss ein ASCII-Bild einlesen, überprüfen, ob Höhe und Breite 100 nicht überschreitet und ob alle Zeilen gleich lang sein. Das Bild soll, wenn die Angaben korrekt sind, mitsamt der Zeichen- und Zeilenanzahl in ein Objekt der Klasse AsciiImage gespeichert werden. Hierbei sollen die Höhe und Breite nur einmal definiert werden können, und das Bild nur mit einer Methode addLine() vergrößert werden können. Ich hab das ganze jetzt also so geschrieben, wie ich vermute dass es richtig ist und... der Compiler wirft mir 29(!) Fehler aus :wein:
    Da ich vermute, dass viele davon Folgefehler aus den ersten sind, ich aber mit den ersten absolut nichts anfangen kann, bzw nicht weiß, was daran falsch sein könnte, bitte ich euch ein weiteres mal um Hilfe :face_with_rolling_eyes:.

    Hier mal main AsciiReader:

    Java
    import java.util.Scanner;
    
    
    class AsciiReader
    {
        public static void main(String [] args)
        {
    
    
            AsciiImage bild = new AsciiImage();
            Scanner eingabe = new Scanner();
            bild.zeile = eingabe.Next();
            Int firstLineBreite = eingabe.length();
            bild.addLine();
            Int LineBreite;
            Int LineHoehe = 1;
    
    
            while (eingabe.hasNext)
            {
    
    
                bild.zeile = eingabe.Next();
                LineBreite = eingabe.length();
                LineHoehe++;
                bild.addLine();
    
    
                if (LineBreite != FirstLineBreite || LineBreite > 100 || LineHoehe > 100)
                {
                    System.out.println("EINGABE FALSCH");
                    System.exit(0);
                }
    
    
            }
    
            bild.hoehe = LineHoehe;
            bild.breite = FirstLineBreite;
            System.out.println(bild.getBild());
            System.out.printl(bild.getHoehe() + " " + bild.getBreite());
    
        }
    }
    Alles anzeigen

    Und hier die Klasse AsciiImage:

    Code
    public class AsciiImage
    {
    
    
        final int hoehe;
        final int breite;
        public String zeile;
        private String dasBild;
    
    
    
        void addLine()
        {
            dasbild = zeile + "\n" + dasbild;
        {
    
    
    
    
        public String getBild()
        {
            return dasBild;
        }
    
    
    
    
        public String getHoehe()
        {
            return hoehe;
        }
    
    
    
    
        public String getBreite()
        {
            return breite;
        }
    }
    Alles anzeigen

    Ich habs schon durchgesehen, und mit den Folien aus der Vorlesung verglichen, kann aber keine groben Fehler finden. Bei public String getBild() etwa meint der Compiler, dass es sich um einen "illegal start of expression" handelt. Aber ich weiß ehrlich nicht, was dran falsch ist, bzw was ich auch nur ändern könnte..

    Würde mich über jegliche Hilfe enorm freuen,

    L.G.: emptyvi :)


    ¤¸¸.•´¯`•¸¸.•..>> Join the herd, join "My Little Pony @ TU-Wien" <<..•.¸¸•´¯`•.¸¸¤
    ¤¸¸.•´¯`•¸¸.•..>> (100% Twilight Sparkle approved) <<..•.¸¸•´¯`•.¸¸¤


    PP-Tutor WS2011 - WS2014
    EVC-Tutor SS2015


  • emptyvi
    14
    emptyvi
    Logo 2012, Platz 2.
    Reaktionen
    102
    Punkte
    2.037
    Beiträge
    374
    • 29. April 2008 um 18:13
    • #2

    Edith meint: Hab eine verkehrte Klammer entdeckt, die ca. die Hälfte aller Fehler verursacht hat *schweiß abwisch* :grinning_face_with_smiling_eyes:
    Die anderen Fehler wie etwa int groß geschrieben, int als string ausgegebn, Scanner nichts mitgegeben, Tippfehler in Variablennamen etc weitgehend ausgemerzt.. Mal schauen, ob es so arbeitet wie es soll :)


    ¤¸¸.•´¯`•¸¸.•..>> Join the herd, join "My Little Pony @ TU-Wien" <<..•.¸¸•´¯`•.¸¸¤
    ¤¸¸.•´¯`•¸¸.•..>> (100% Twilight Sparkle approved) <<..•.¸¸•´¯`•.¸¸¤


    PP-Tutor WS2011 - WS2014
    EVC-Tutor SS2015


  • Vater Gans
    10
    Vater Gans
    Mitglied
    Reaktionen
    2
    Punkte
    927
    Beiträge
    173
    • 29. April 2008 um 19:56
    • #3

    Benutzt du keine IDE die dich auf so kleine Fehler hinweist?

    lg

  • emptyvi
    14
    emptyvi
    Logo 2012, Platz 2.
    Reaktionen
    102
    Punkte
    2.037
    Beiträge
    374
    • 30. April 2008 um 03:07
    • #4

    Nein, da uns gesagt wurde, dass wir das nicht tun sollen, damit wir lernen, sich nicht auf Autovervollständigen-Funktionen etc. zu verlassen, sondern den Code selber kennen. :thinking_face:

    Ich habe es aber, nachdem mir der Knopf schließlich doch noch aufgegangen ist, trotzdem geschafft :))

    Der Vollständigkeit halber hier mal der Code:

    AsciiReader.java:

    import java.util.Scanner;

    Code
    class AsciiReader
    {
        public static void main (String [] args)
        {
    
    
            AsciiImage bild = new AsciiImage();
            Scanner eingabe = new Scanner(System.in);
            bild.zeile = eingabe.next();
            int FirstLineBreite = (bild.zeile).length();
            bild.addLine();
            int LineBreite;
            int LineHoehe = 1;
    
    
            while (eingabe.hasNext())
            {
    
    
                bild.zeile = eingabe.next();
                LineBreite = (bild.zeile).length();
                LineHoehe++;
                bild.addLine();
    
    
                if (LineBreite != FirstLineBreite || LineBreite > 100 || LineHoehe > 100)
                {
                    System.out.println("FALSCHE EINGABE");
                    System.exit(0);
                }
    
    
            }
    
            bild.setHoehe(LineHoehe);
            bild.setBreite(FirstLineBreite);
            System.out.println(bild.getBild());
            System.out.println(bild.getHoehe() + " " + bild.getBreite());
    
        }
    }
    Alles anzeigen


    AsciiImage.java:

    Code
    public class AsciiImage
    {
    
    
        private int hoehe;
        private int breite;
        public String zeile;
        private String dasBild;
    
        public void setBreite(int b)
        {
            this.breite = b;
        }
    
    
        public void setHoehe(int h)
        {
            this.hoehe = h;
        }
    
    
        void addLine()
        {
            if (this.dasBild == null)
            {
                this.dasBild = zeile + "\n";
            }
            else
            {
                this.dasBild = zeile + "\n" + this.dasBild;
            }
        }
    
    
    
    
        public String getBild()
        {
            return dasBild;
        }
    
    
    
    
        public int getHoehe()
        {
            return hoehe;
        }
    
    
    
    
        public int getBreite()
        {
            return breite;
        }
    }
    Alles anzeigen

    L.G.: emptyvi :thumb:


    ¤¸¸.•´¯`•¸¸.•..>> Join the herd, join "My Little Pony @ TU-Wien" <<..•.¸¸•´¯`•.¸¸¤
    ¤¸¸.•´¯`•¸¸.•..>> (100% Twilight Sparkle approved) <<..•.¸¸•´¯`•.¸¸¤


    PP-Tutor WS2011 - WS2014
    EVC-Tutor SS2015


  • Ringding
    11
    Ringding
    Mitglied
    Reaktionen
    12
    Punkte
    1.237
    Beiträge
    244
    • 30. April 2008 um 09:17
    • #5
    Zitat von emptyvi

    Nein, da uns gesagt wurde, dass wir das nicht tun sollen, damit wir lernen, sich nicht auf Autovervollständigen-Funktionen etc. zu verlassen, sondern den Code selber kennen. :thinking_face:

    So ein Schwachsinn!

    Bei jedem halbwegs vernünftigen Editor merkt man so etwas sofort. Es muss ja noch nichtmal eine komplette IDE sein. Aber wenn man sich wundert, warum der Editor die Einrückung komisch macht, dann wird man sehr bald auf solche Sachen draufkommen :winking_face:

  • Vater Gans
    10
    Vater Gans
    Mitglied
    Reaktionen
    2
    Punkte
    927
    Beiträge
    173
    • 2. Mai 2008 um 15:06
    • #6
    Zitat von emptyvi

    Nein, da uns gesagt wurde, dass wir das nicht tun sollen, damit wir lernen, sich nicht auf Autovervollständigen-Funktionen etc. zu verlassen, sondern den Code selber kennen. :thinking_face:

    Mm und wo genau ist jetzt der Unterschied ob dich hier im Forum wer auf Syntaxfehler aufmerksam macht oder dies gleich der Editor übernimmt? :confused: :winking_face:

  • a9bejo
    21
    a9bejo
    Mitglied
    Reaktionen
    42
    Punkte
    4.697
    Beiträge
    913
    • 3. Mai 2008 um 10:38
    • #7
    Zitat von emptyvi

    Nein, da uns gesagt wurde, dass wir das nicht tun sollen, damit wir lernen, sich nicht auf Autovervollständigen-Funktionen etc. zu verlassen, sondern den Code selber kennen. :thinking_face:

    Das war aus meiner Erfahrung auch ein guter Rat. Was Du falsch gemacht hast ist ein ganz typischer Anfaengerfehler: Du hast die Fehlermeldungen ignoriert.

    Wenn ich versuche deinen Code zu kompilieren, dann sagt mir der Compiler ziemlich detailiert, was damit nicht stimmt:

    Code
    Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
    	The constructor Scanner() is undefined
    	The method Next() is undefined for the type Scanner
    	Int cannot be resolved to a type
    	The method length() is undefined for the type Scanner
    	Int cannot be resolved to a type
    	Int cannot be resolved to a type
    	eingabe.hasNext cannot be resolved or is not a field
    	The method Next() is undefined for the type Scanner
    	The method length() is undefined for the type Scanner
    	FirstLineBreite cannot be resolved
    	FirstLineBreite cannot be resolved
    	The method printl(String) is undefined for the type PrintStream
    Alles anzeigen

    Also wenn da in der ersten Zeile steht "The constructor Scanner() is undefined", dann schaust Du Dir halt mal als erstes in der Doku die Klasse Scanner an. Da siehst du dann auch das der Compiler dich nicht belogen hat: Da gibt es keinen Konstruktor ohne Argumente.

    Wenn da in der Zweiten Zeile steht, das der Type Scanner keine Methode Next() hat, na dann wird das schon stimmen. Wieder in der Doku nachschauen und fertig.

    Wenn Dein Programm dann syntaktisch korrekt ist, aber es zur Laufzeit einen Fehler gibt, dann bekommst Du meist eine sogenannte Stacktrace zurueck: Da siehst Du dann den Programmfluss, bei dem der Fehler aufgetreten ist. Und zwar huebsch mit den Namen der Klassen und Methoden, die da aufgerufen wurden. D.h. wenn Du als Fehlermeldung sowas bekommst:

    Code
    Exception in thread "main" java.lang.NullPointerException
    	at MyTest.run(MyTest.java:7)
    	at MyTest.main(MyTest.java:11)

    Dann gehst Du von oben nach unten duch die Zeilen, bis Du zu der ersten Methode kommst, die zu deinem eigenen Code gehoert. Dann weisst du auch ganz genau, wo da der Fehler ist.

    Wenn Du nicht weisst was eine NullPointerException ist => Doku schauen oder hier nachfragen.

    Wenn dein Programm keine Fehler wirft, aber sich nicht so verhält, wie du es geplant hast: einfach mal den Programmfluss durchgehen und z.b. mit System.out.println die Werte von einzelnen Variablen ausgeben. Dann siehst du auch gleich, wo was schiefgelaufen ist.


    Oh, und ganz wichtig: Ich wuerde niemals wieder so viel Code schreiben, wie du es hier getan hast, ohne zwischendurch zu kompilieren und zu schauen, ob alles bis jetzt passt.

    Also Du haettest z.b. bei diesem Stand vom AsciiReader das erste mal kompilieren sollen:

    Java
    import java.util.Scanner;
    
    
    class AsciiReader
    {
        public static void main(String [] args)
        {
    
    
             Scanner eingabe = new Scanner();
        }
    }
    Alles anzeigen

    Weil kompilieren kostet meisten nichts, und Fehler suchen schon.


    Zusammengefasst: Debuggen muss man aktiv, nicht passiv. Stundenlang auf den Code schauen und raten ist der falsche weg. Feedback erzeugen und interpretieren ist viel gescheiter.

    lg, Benjamin Ferrari, bookworm.at

  • Maximilian Rupp 27. Dezember 2024 um 12:04

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Rechtliches

Impressum

Datenschutzerklärung