toString-Methode gibt immer null vor Variable aus

passi

Mitglied
Hi, folgende toString-Methode habe ich definiert:

Java:
	public String toString() {
		for (int i = 1; i <= getAnzahlDiamanten(); i++) {
			d += "D";
		}

		for (int i = 1; i <= getAnzahlRubine(); i++) {
			r += "R";
		}

		for (int i = 1; i <= getAnzahlSmaragde(); i++) {
			s += "S";
		}
		return "(" + d + r + s + ")";
	}

So, in einem Objekt liegen z.B. 2 Diamanten, 3 Rubine und 4 Smaragde. Jetzt sollen die Edelsteine wie folgt ausgegeben werden:
Java:
(DDRRRSSSS)

aber die Ausgabe ist immer folgende:
Java:
(nullDDnullRRRnullSSSS)

In derselben Klasse, aber nicht in der toString-Methode habe ich folgende Variablen deklariert und initialisiert:
Java:
private String d = null;
	private String r = null;
	private String s = null;

Ich weiß nicht warum immer vor der Variablen null ausgegeben wird.

Gruß

passi
 
Schau dir an was
Java:
System.out.println(null + "D");
liefert.
 
Das ging mir auch schon durch den Kopf. Klar das bei
Java:
System.out.println(null + "D");

die Ausgabe

Java:
nullD
ist.

Nur komme ich nicht darauf, den Fehler zu beheben. Die String-Variablen nicht zu initialisieren bringt natürlich nichts, da der Compiler die Variablen doch selbstständig mit null initialisiert. Die for-Schleifen sollten so bleiben, damit ich soviele "R" ausgegeben bekomme, wie Rubine auch vorhanden sind.
 
Dann initialisier die Variablen doch mit nem leeren String:
Java:
private String d = "";
 
🙂 Ja klar, so einfach eigentlich. Vielen Dank!
Das eigentliche Problem hat sich somit erledigt, mich würde nur interessieren ob der Code so ok ist oder ist es unschön extra Objektvariablen (String d usw.) anzulegen?!
 
Ja, ich würde die Instanzvariablen d r und s rausschmeißen, die brauchst du ja nur in der toString Methode.
Machs doch z.b. so:
Java:
public String toString() {
    String s = "(";
    for (int i = 1; i <= getAnzahlDiamanten(); i++) {
        s += "D";
    }
 
    for (int i = 1; i <= getAnzahlRubine(); i++) {
        s += "R";
    }
 
    for (int i = 1; i <= getAnzahlSmaragde(); i++) {
        s += "S";
    }
    s += ")";
    return s;
}
Das ganze kann man dann mit nem StringBuilder noch etwas schöner lösen.
 
Ich hätte da doch noch einmal eine Frage. Wenn ich meine Version der toString-Methode benutze und im Verlauf die Diamanten, Rubine und Smaragde alle auf 0 setze, die Truhe somit leer ist, dann bekomme ich aber immer noch die Ausgabe von vorher. Folgend das Problem ganz konkret:

Java:
Diamanten im Schatzkaestchen: 2
Rubine im Schatzkaestchen: 3
Smaragde im Schatzkaestchen: 4
(DDRRRSSSS)
Diamanten im Schatzkaestchen: 0
Rubine im Schatzkaestchen: 0
Smaragde im Schatzkaestchen: 0
(DDRRRSSSS)

Wundert mich, mit der Methode von EikeB tritt das Problem nicht auf. Ich habe auch beim erneuten Aufruf meiner info-Methode (die das Objekt zurückgibt) folgende Zeile mal explizit mit angegeben:
Java:
System.out.println(chest.ausgeben().toString());
, dies ändert aber nichts. Wo liegt das Problem und wann wird die toString-Methode immer aufgerufen? Wenn das Objekt an den Caller zurückgegeben wird?

Gruß

passi
 
Du hast ja deine Strings auch als Instanzvariablen angelegt. Einmal gefüllt bleiben die Strings gefüllt bis du denen was anderes zuweist.
 
Ok, dann bräuchte ich die Instanzvariablen in meiner Methoden leeren() nur wieder mit einem leeren String initialisieren. Das hin und her spricht nun ganz klar für deine Methode 🙂
Danke
 

Zurück
Oben