Array mit Objekten lässt sich nicht auslesen

Monsees

Mitglied
Hey Leute,
ich habe schon wie wild alle mir bekannten Suchmaschinen bedient, doch konnte ich keine passende Antwort finden (oder habe mich zu dumm angestellt…)

Ich habe eine Klasse "Hunde" angelegt, die von der Klasse "Tiere" erbt. Die Klasse "Hunde" nimmt nur Strings entgegen. Jetzt habe ich zwei Objekte der Klasse "Hunde" in mein Array "hundeArray" eingelesen und versuche mir diese ausgeben zu lassen. Er schmeisst mir aber nur die Speicheradressen raus. Nutze ich .toString() hat er mir die erste Speicheradresse raus und dann eine NullPointerException. Habt ihr nen Tipp für mich?

Java:
 Hunde[] hundeArray = new Hunde[4];
		
		hundeArray[0]=dog1;
		hundeArray[3]=dog2;
		
		for(int i=0; i<hundeArray.length;i++)
		{
			System.out.println(hundeArray[i]);
			
		}
 
Kannst du das vielleicht etwas konkretisieren?
Die Klasse sieht so aus:

Java:
 public class Hunde extends Tiere 
{
	String gefährlich;
	
	public Hunde(String rasse, String name, String gefährlich)
	{
		super(rasse,name); 
		this.gefährlich=gefährlich;
			
	}

Das sind doch alles Strings. Wieso sollte ich da toString verwenden?

Ich habe es mal bei der Ausgabe probiert. Bekomme da aber auch nix vernünftiges:

Java:
 for(int i=0; i<hundeArray.length;i++)
		{
			System.out.println(hundeArray[i].toString());
			
		}

Macht auch nach Rheinwerk keinen Sinn. Dort steht: "Das Angenehme ist, dass toString() automatisch aufgerufen wird, wenn die Methoden print() oder println() mit einer Objektreferenz als Argument aufgerufen werden. Ähnliches gilt für den Zeichenkettenoperator + mit einer Objektreferenz als Operand:"
 
Zuletzt bearbeitet:
Du sollst ja nicht toString aufrufen, sondern es implementieren.

Ich zitiere aus meinem Link :
9.3.2 Objektidentifikation mit »toString()

Jedes Objekt sollte sich durch die Methode toString() mit einer Zeichenkette identifizieren und den Inhalt der interessanten Attribute als Zeichenkette liefern.

Füge nun einmal folgende (etwas veränderte) Methode aus der zitierten Quelle zur Klasse Tiere hinzu:
Java:
  @Override
  public String toString()
  {
    return getClass().getName() +
           "[name=" + name +
           ",rasse=" + rasse + "]";
  }
Eventuell musst du die beiden Instanzvariablen "name" und "rasse" anpassen, falls sie bei dir anders heißen.
Dann probier dein Programm noch einmal aus.
 
Hallo,
so wie dein Code jetzt dransteht müsste aussehen:
Du musst ihm ja auch sagen dass in manchen Arrays "kein Inhalt" ist. Deshalb try/catch

Code:
		 String[] hundeArray = new String[4];
		 
			hundeArray[0]= "dog1";
			hundeArray[3]= "dog2";
	 
			for(int i=0; i<hundeArray.length;i++)
			{
				
				try{
				System.out.println(hundeArray[i]);
				} catch (NullPointerException e) {
					
				}

Jetzt meinst du ja der Erbt von einer ganz anderen Klasse.
Dazu musst du erstmal das Array der Klasse Tiere in die Klasse Hunde implementieren.
Anschließend mit einer Zählschleife jedes einzelne Array der beiden Klassen zuordnen und dann sollte er was anzeigen.

Wenn du das nicht kapierst helfe ich auch gerne detailierter. Ich hoffe nur ich habe dich richtig verstanden^^
 
Zuletzt bearbeitet:
RJ019, dein Code ist schlichtweg unnötig, da das Array "hundeArray" in dem Code immer initialisiert ist. Der Aufruf hundeArray kann somit niemals eine NPE werfen, da println auch null entgegen nimmt.
 
@Dompteur: vielen Dank! Das hat funktioniert.

Jetzt würde ich aber noch gerne verstehen, was da genau passiert. Ich habe mir die entsprechenden Passagen in dem von dir zitierten Buch durchgelesen und möchte es einmal in eigenen Worten versuchen.

Das Problem ist, dass bei Aufruf von print() oder println() automatisch die Methode toString() aufgerufen wird, die jedoch aufgrund ihrer Definition in der Object-Klasse nur zur Ausgabe des Klassennamens + Hash-Wert führt. Das heißt, ich schreibe mir die toString()-Methode hier entsprechend meinen Bedürfnissen neu, richtig?
 
Das Problem ist, dass bei Aufruf von print() oder println() automatisch die Methode toString() aufgerufen wird, die jedoch aufgrund ihrer Definition in der Object-Klasse nur zur Ausgabe des Klassennamens + Hash-Wert führt. Das heißt, ich schreibe mir die toString()-Methode hier entsprechend meinen Bedürfnissen neu, richtig?
Richtig.
Zumindest in Klassen, die Daten halten, solltest du die toString Methode immer überschreiben. Welche Instanzvariablen du dabei in den String aufnimmst, musst du selbst bestimmen. Es sollten halt "sinnvolle" Daten sein, die dein toString liefert ;-).

print/println prüfen übrigens auch, ob du ein Null-Element übergeben hast. Dann wird natürlich kein toString aufgerufen, sondern der fixe String "null" geschrieben.
 
Eine Frage hab ich aber doch noch!

Wofür das getName() bei getClass().getName()? Wieso muss ich für die Rasse da kein getRasse() anhängen?
 
Das getName() ist nicht "deine" Methode, sondet stammt aus der Reflection-Klasse von Java. Lass dir mal testweise nur getClass() ausgeben oder schaus dir im Debugger an, dann wirds dir vielleicht etwas klarer.
 
Zuletzt bearbeitet:

Zurück
Oben