PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java - Zuweisung mit einem Array und Objekten geht nicht


PHuV
2007-05-09, 18:16:54
Wo ist mein Denkfehler?


public class ATest {
public static void main( String[] argv ) {
ArrayTest tt = new ArrayTest();
ArrayTest[] t2 = new ArrayTest[10];

tt.wort = "Dies ist ein Satz";
t2[0].wort = "Dies ist ein anderer Satz";
int i = tt.getLength();
int i2 = t2[0].getLength();

System.out.println("Wort=<" + tt.wort + "> mit Länge " + i);
System.out.println("Wort=<" + t2[0].wort + "> mit Länge " + i2);
}
}


class ArrayTest {
String wort;

int getLength () {
return wort.length();
}

}


Es knallt an Zeile 9 :confused:


Exception in thread "main" java.lang.NullPointerException
at test.ATest.main(ATest.java:9)


Was mache ich falsch? Ich deklariere ein Objekt mit einem Array und will dem ersten Objekt im Array einen String zuweisen?

Trap
2007-05-09, 18:26:37
Arrays für Objekte werden mit null als Inhalt initialisiert, nach der Zeile
ArrayTest[] t2 = new ArrayTest[10];
sieht t2 so aus:
{null,null,null,null,null,null,null,null,null,null}

PHuV
2007-05-09, 18:30:36
Arrays für Objekte werden mit null als Inhalt initialisiert, nach der Zeile
ArrayTest[] t2 = new ArrayTest[10];
sieht t2 so aus:
{null,null,null,null,null,null,null,null,null,null}

Ok, verstehe ich! Was muß ich dann also tun, um t2[0].wort was zuweisen zu können?

RMC
2007-05-09, 18:30:45
Genau, du müsstest noch für jedes Element aus t2 eine neue Instanz anlegen.


for(int i=0;i<10;i++)
{
t2[i] = new ArrayTest();
}

PHuV
2007-05-09, 18:38:49
Genau, du müsstest noch für jedes Element aus t2 eine neue Instanz anlegen.


for(int i=0;i<10;i++)
{
t2[i] = new ArrayTest();
}


Ok, ich bin doof ;), danke.

Hm, ich dachte, Java macht so viel automatisch, aber an so was muß man selbst denken.

Weitere Frage, wie kann man ein Array offen lassen, da man nicht weiß, wie viele kommen werden?


ArrayTest[] t2 = new ArrayTest[];


In C hätte ich etwas vorinitialisiert und bei Bedarf kräftig nachinitialisiert. Wie mache ich das in Java? :confused:

Monger
2007-05-09, 18:49:31
Hm, ich dachte, Java macht so viel automatisch, aber an so was muß man selbst denken.

Ich fände es eher komisch, wenn Java mal auf Verdacht irgendwelche Objekte instanziieren würde. ;)
Das könnte es auch gar nicht. Längst nicht alle Klassen haben Standardkonstruktoren, und wo sollen denn da die Parameter herkommen?


Weitere Frage, wie kann man ein Array offen lassen, da man nicht weiß, wie viele kommen werden?

Geht nicht. Sobald Arrays erstmal instanziiert werden, haben sie eine fixe Größe.
Schau dir mal die ArrayList Klasse an, die tut wahrscheinlich genau das was du brauchst, d.h. die kannst du im Prinzip beliebig füllen, und brauchst dich nicht mit irgendwelchen Array-Längen rumprügeln.



ArrayTest[] t2 = new ArrayTest[];


In C hätte ich etwas vorinitialisiert und bei Bedarf kräftig nachinitialisiert. Wie mache ich das in Java? :confused:
Was meinst du mit vor- und nachinitialisieren? Kann mehr als einmal initialisieren?!?
Mach mal bitte ein Beispiel in C.

RMC
2007-05-09, 18:50:29
Ok, ich bin doof ;), danke.

Hm, ich dachte, Java macht so viel automatisch, aber an so was muß man selbst denken.

Ist in Java aber logisch, weil er ja nur das Array anlegt. Ohne Angabe vom Konstruktor kann er ja nicht wissen, wie er die Objekte anlegen soll. Deshalb standardmäßig NULL.


Weitere Frage, wie kann man ein Array offen lassen, da man nicht weiß, wie viele kommen werden?


ArrayTest[] t2 = new ArrayTest[];


In C hätte ich etwas vorinitialisiert und bei Bedarf kräftig nachinitialisiert. Wie mache ich das in Java? :confused:


ArrayTest[] t2;

...some code....

t2 = new ArrayTest[4711];



Oder meinst du was anderes?

Wenn du meinst dass die Größe varriiert, dann würd ich Listen nehmen.

PHuV
2007-05-09, 18:56:01
ArrayTest[] t2;

...some code....

t2 = new ArrayTest[4711];



Oder meinst du was anderes?

Wenn du meinst dass die Größe varriiert, dann würd ich Listen nehmen.

Letzeres, oder man muß vorher doch feststellen, wie viel man braucht. So dynamisch nachträglich anpassen ist wohl nicht? Das mit Listen ist eine Idee, danke.

][ceThunder
2007-05-16, 10:26:33
Weitere Frage, wie kann man ein Array offen lassen, da man nicht weiß, wie viele kommen werden?


Ein Array nicht, da wirst du mit Vektoren arbeiten müssen.
Wirf mal einen Blick auf die Klasse Vector (java.util glaub ich). Allerdings läuft das da nicht über Zuweisungen, sondern über die Funktion addElement (wenn ich mich recht erinnere...was ja aber kein Problem darstellen sollte... ;-)

Monger
2007-05-16, 10:32:28
[ceThunder;5498826']Ein Array nicht, da wirst du mit Vektoren arbeiten müssen.
Wirf mal einen Blick auf die Klasse Vector (java.util glaub ich). Allerdings läuft das da nicht über Zuweisungen, sondern über die Funktion addElement (wenn ich mich recht erinnere...was ja aber kein Problem darstellen sollte... ;-)

Du bist ein BÖSER Mensch! :D
Vector ist zwar noch nicht deprecated, wird es aber wohl in nicht allzu ferner Zukunft werden.
Bitte keine Vector Klasse mehr verwenden!
Wenn man unbedingt eine synchronisierte Liste braucht, gibt es dafür mittlerweile die synchronizedList (http://java.sun.com/javase/6/docs/api/java/util/Collections.html#synchronizedList(java.util.List)), und ansonsten ArrayList! (oder natürlich eine der anderen List Implementierungen, wenn man sie denn braucht)

Gast
2007-05-16, 16:08:07
Du bist ein BÖSER Mensch! :D


Ich weiß...;-)

Ist schon länger her, dass ich ernsthaft mit Java gearbeitet habe und zu der Zeit war Vector noch "das Maß aller Dinge" ;-)

HellHorse
2007-05-16, 17:41:59
Ist schon länger her, dass ich ernsthaft mit Java gearbeitet habe und zu der Zeit war Vector noch "das Maß aller Dinge" ;-)
Java 2 kam Ende 1998 ....