tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von Akeshihiro
ERLEDIGT
NEIN
ANTWORTEN
4
ZUGRIFFE
697
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    nnif nnif ist offline Grünschnabel
    Registriert seit
    Dec 2011
    Beiträge
    3
    Ich habe in der uni so eine Aufgabe bekommen, in der man eine Klasse programmieren soll, mit der man dann das vorgegebene Codestueck fehlerfrei uebersetzen und ausfuehren kann.
    Genauer gesagt gibt es eine fest vorgegebene Hauptklasse (Decoration.java, mit main-Methode und mehreren Methodenaufrufen. Und dazu soll man dann halt eine passende Klasse programmieren, mit passenden Methoden (LittleTree.java).
    Ja, mein Problem ist jetzt, dass in der vorgegebenen Klasse, in mehreren Methodenaufrufen, Stringkonstanten, enthalten sind:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    
    class Decoration {
     
      public static void main(String[] args) {
      LittleTree susisTree = new LittleTree();
      susisTree.setBoughs(7); // Anzahl Zweige zum Anhaengen von Schmuck
      susisTree.addDeco("rote Kugel");
      susisTree.addDeco("silberne Kugel");
      susisTree.addDeco("Kerze");
      susisTree.addDeco("Kerze");
      susisTree.addDeco("Kerze");
      susisTree.addDeco("Schoko-Weihnachtsmann");
      susisTree.addDeco("goldener Tannenzapfen");
      susisTree.addDeco("Stern");
      Out.println("\nSusis Baum fuer Aufgabe a):");
      susisTree.showTree();
     
    Und wenn ich die Methode addDeco so schreibe (nur die Woerter String und deco sind wichtig):
     
    void addDeco(String deco) {
        if (boughsAreSet == false || decoratedBoughs >= boughs) {
          Out.println("Anhaengen " + deco + " ist leider nicht moeglich.");
        } else { // boughsAreSet && decoratedBoughs < boughs
          for(int j = 0, i = 0; j < deco.length(); j++) {
            a[i][j] = deco.charAt(j);
          }
          decoratedBoughs++;
        }  
      }
    ... also den String deco als Parameter deklariere, kommt sowas:

    Exception in Thread "main" java.lang.NullpointerException
    at LittleTree.addDeco(LittleTree.java:22)
    at Decoration.main(Decoration.java:6)


    Vielleicht muesste ich den String noch als Objekt erzeugen, oder so (aber wie mache ich das, ohne alle Konstanten in LittleTree.java reinschreiben zu muessen). Die Konstanten sollen ja an die Methode addDeco geschickt werden. Und veraendern, darf ich Decoration.java, wie gesagt, nicht.

    Danke.

    Gruss nnif
    Geändert von sheel (24.12.11 um 11:04 Uhr) Grund: Codetags
     

  2. #2
    nnif nnif ist offline Grünschnabel
    Registriert seit
    Dec 2011
    Beiträge
    3
    oh sorry, ich hatte das char array noch nicht erzeugt. Funktioniert zwar immernoch nur teilweise, bisher, aber mit dem String schicken, das hat geklappt. Also das Problem (das gar nicht existiert hat) ist zumindest schonmal geloest.
     

  3. #3
    Avatar von Akeshihiro
    Akeshihiro Akeshihiro ist offline Mitglied Platin
    Registriert seit
    Aug 2008
    Ort
    Kirchlengern (NRW)
    Beiträge
    647
    Willkommen hier im Forum und Frohe Weihnachten

    Wir haben hier für die Quellcodes entsprechende Code-Tags. Für Java sind es [java][/java].
    Außerdem sehe ich da keine Stringkonstante, aber das ist eigentlich eher uninteressant
    Was viel interessanter ist, ist was du da mit einem char-Array machst. Wieso so umständlich? Es bietet sich eine Liste viel mehr an. Ich denke, ich verstehe auch, was du da versuchst. Aber dann brauchst du nicht die Variable i, sondern decoratedBoughs.
    nnif bedankt sich. 
    Man sagt, das Schwert eines Samurai sei seine Seele ...

    Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.

    Das Schmieden ist eine Kunst; Das Schreiben auch ;)

  4. #4
    nnif nnif ist offline Grünschnabel
    Registriert seit
    Dec 2011
    Beiträge
    3
    jo, danke fuer das Willkommen . Hallo auch. Schoenes Forum hier.
    Ich hab jetzt statt dem char Array ein String Array genommen. Bei Zwischenaufgaben (mit nur einem Teil von Decoration.class) hat alles funktioniert, aber jetzt gibts irgendwie schon wieder eine NullPointerexception.
    Die ganze vorgegebene Klasse:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    
    class Decoration {
     
      public static void main(String[] args) {
      LittleTree susisTree = new LittleTree();
      susisTree.setBoughs(7); // Anzahl Zweige zum Anhaengen von Schmuck
      susisTree.addDeco("rote Kugel"); // line 6
      susisTree.addDeco("silberne Kugel");
      susisTree.addDeco("Kerze");
      susisTree.addDeco("Kerze");
      susisTree.addDeco("Kerze");
      susisTree.addDeco("Schoko-Weihnachtsmann");
      susisTree.addDeco("goldener Tannenzapfen");
      susisTree.addDeco("Stern");
      Out.println("\nSusis Baum fuer Aufgabe a):");
      susisTree.showTree();
      susisTree.replaceDeco("silberne Kugel", "goldene Kugel");
      Out.println("Susis Baum fuer Aufgabe b):");
      susisTree.showTree();
      susisTree.removeDeco("Kerze");
      susisTree.removeDeco("Schoko-Weihnachtsmann");
      susisTree.removeDeco("rote Kugel");
      susisTree.addDeco("Glocke");
      Out.println("Susis Baum fuer Aufgabe c):");
      susisTree.showTree();
      Out.println("An Susi's Baum sind "
      + susisTree.getFree()
      + " Zweige frei\n");
      }
      
    }
    Die ganze Klasse fuer das Objekt susisTree vom Typ LittleTree, die ich bisher geschrieben habe:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    
    class LittleTree {
      int nextFreeElement;
      int boughs;
      String[] decoArray;
      
      void setBoughs(int b) {
        boughs = b;
          if (boughs > 0) {
            decoArray = new String[boughs];
          }
      }
      
      void addDeco(String deco) {
        if (decoArray == null || getFree() == 0) { // line 14
          Out.println("Anhaengen " + deco + " ist leider nicht moeglich.");
        } else { // decoArray != null && getFree() != 0
          for (int i = 0; i < boughs; i++) {
            if (decoArray[i].equals("empty")) {
              decoArray[i] = deco;
            }
          }
        }  
      }
      
      void replaceDeco(String takeAway, String replaceWith) {
        for(int i = 0; i < boughs; i++) {
          if (decoArray[i].equals(takeAway)) {
            decoArray[i] = replaceWith;
            break;
          }
        }
      }
      
      void removeDeco(String remove) {
        for(int i = 0; i < boughs; i++) {
            if (decoArray[i].equals(remove)) {
              decoArray[i] = "empty";
            }
        }
      }
      
      int getFree() {
        int freeBoughs = 0;
        for (int i = 0; i < boughs; i++) {
          if (decoArray[i].equals("empty")) { // line 45
            freeBoughs++;
          }
        }
        return freeBoughs;
      }
           
              
        
      void showTree() {
        for(int i = 0; i < boughs; i++) {
          if (!decoArray[i].equals("empty")) {
            Out.print("\n   " + decoArray[i]);
          } 
        }
        Out.print("\n\n");
      }  
      
    }
    Vielleicht koennte ich auch "", anstatt "empty" schreiben, aber das ist ja nicht so wichtig.
    Die Fehlermeldung sieht so aus:
    ....(Path)>java Decoration
    Exception in Thread "main" java.lang.NullpointerException
    at LittleTree.getFree(LittleTree.java:45)
    at LittleTree.addDeco(LittleTree.java:14)
    at Decoration.main(Decoration.java:6)
    Ich geh mal davon aus, dass Zeile 14 angezeigt wird, weil dort auf getFree() verwiesen wird. Aber was ist dann an Zeile 45, in getFree, falsch?
    Bei replaceDeco hat decoArray[i].equals("...") schliesslich auch funktioniert.
    Was hab ich falsch gemacht? Wuerde mich ueber eine Antwort freuen .

    Gruss nnif
    Geändert von nnif (24.12.11 um 19:40 Uhr)
     

  5. #5
    Avatar von Akeshihiro
    Akeshihiro Akeshihiro ist offline Mitglied Platin
    Registriert seit
    Aug 2008
    Ort
    Kirchlengern (NRW)
    Beiträge
    647
    Falsch gemacht hast du, dass du scheinbar nicht weißt, was dein Programm macht. Hast du schon mal versucht nachzuvollziehen, an welchem Punkt dein Programm was macht und welche Werte wo sind? Also einfach schlichtes Debugging ...

    Das Problem ist eben genau das "empty". Mit setBoughs() erzeugst du zwar ein Array, initialisierst es aber mit keinem einzigen Wert. Das heißt, es wird die Standardinitialisierung verwendet. String ist eine Klasse und erzeugt somit Objekte. In Java werden Objekt-Variablen mit null initialisiert, wenn keine explizite Initialisierung erfolgt. An null-Objekten kann man keine Methodenaufrufe machen, denn es gibt kein Objekt, das den Aufruf tätigen könnte. Deswegen gibt es dann eine NullPointerException.

    So, was heißt das jetzt? Das heißt, dass jedes einzelne Feld von deinem decoArray den Wert null hat (nicht "empty"!). Um also herauszufinden, ob ein Feld belegt ist oder nicht, musst du prüfen, ob das Feld null ist.

    PS:
    Bei replaceDeco() hat das nur geklappt, weil die Dekoration bereits existierte und die Methode nicht auf ein leeres Feld gestoßen ist, sonst hätte es nämlich auch da geknallt.
     
    Man sagt, das Schwert eines Samurai sei seine Seele ...

    Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.

    Das Schmieden ist eine Kunst; Das Schreiben auch ;)