Stringkonstante im Rufer

nnif

Grünschnabel
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:
Java:
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
 
Zuletzt bearbeitet von einem Moderator:
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.
 
Willkommen hier im Forum und Frohe Weihnachten ^^

Wir haben hier für die Quellcodes entsprechende Code-Tags. Für Java sind es [code=java][/code].
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.
 
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:
Java:
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:
Java:
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
 
Zuletzt bearbeitet:
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.
 
Zurück