1Danke
ERLEDIGT
NEIN
NEIN
ANTWORTEN
4
4
ZUGRIFFE
697
697
EMPFEHLEN
-
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:
... also den String deco als Parameter deklariere, kommt sowas: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++; } }
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 nnifGeändert von sheel (24.12.11 um 11:04 Uhr) Grund: Codetags
-
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.
-
24.12.11 08:37 #3
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.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 ;)
-
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:
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
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"); } }
Vielleicht koennte ich auch "", anstatt "empty" schreiben, aber das ist ja nicht so wichtig.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"); } }
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 nnifGeändert von nnif (24.12.11 um 19:40 Uhr)
-
25.12.11 09:46 #5
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 ;)





Zitieren
Login





