Array füllen?

Hallo,
würde gerne mit drawPolyline() einen Graphen zeichnen. Dazu übergebe ich bisher einfach Arrays, int xWerte[] = {1,2,3,4,5} und int yWerte[]={5,10,5,3,15}. Klappt auch ganz gut: g.drawPolyline(xWerte, yWerte, 5);

Jetzt möchte ich gerne in einer anderen Klasse Werte aus einer Textdatei einlesen, in ein Array packen und dann der Klasse mit dem g.drawPolyline() übergeben. Aber irgendwie klappt das ganze nicht so recht, so bin ich bisher vorgegangen:

public static float yWerte[];
...
public static void readFile() {
		int i=0;

		try {
			BufferedReader buffy=new BufferedReader(new FileReader("Zahlen.txt"));
			String line=null;
			
			while((line=buffy.readLine())!=null) {
				i++;
				
				line.trim();
			
				
				String[] teile = line.toString().split("	"); 
				SZahl1 = teile[0].trim();
				SZahl2 = teile[1].trim();
				SZahl3 = teile[2].trim();
				SZahl4 = teile[3].trim();
				SZahl5 = teile[4].trim();

				zahl1 = Float.parseFloat(teile[0]);
				zahl2 = Float.parseFloat(teile[1]);
				zahl3 = Float.parseFloat(teile[2]);
				zahl4 = Float.parseFloat(teile[3]);
				zahl5 = Float.parseFloat(teile[4]);

								yWerte**=zahl4;
	...
usw.

Das ganze wird auch sauber compilet, nur bekomme ich beim ausführen für “yWerte**=zahl4;” eine NullPointerException. Was mache ich da falsch?

joa weil es würde Vorteile bringen wenn du deinen Array auch initialisieren würdest :wink:

Außerdem solltest du es vermeiden Objekte in einer Schleife anzulegen.

wieso?

Unnötige Objekte die irgendwo rumfliegen und erst dann wieder speicher freigeben, wenn der GC dazu mal lust hat!?

wie willst du sonst jemals etwas in einer Schleife bearbeiten?
wenn du meinst

String s;
while(..)
{
  s = new String();
}

ist das genau das Gleiche wie wenn er in der while String s= new String sagt

Also imho müsste doch sowas

   String str = "irgendwas";
}```

jedesmal ein neues Objekt des Types String anlegen, wohingegen das hier

```String str = null;
while (blub) {
   str = "irgendwas"
}```

immer das eine Objekt überschreibt.

[QUOTE=Null]Also imho müsste doch sowas

   String str = "irgendwas";
}```
[/quote]
das legt das an und es wird nach der Schleife zum Vernichten freigegeben

> 
> jedesmal ein neues Objekt des Types String anlegen, wohingegen das hier
> 
> ```String str = null;
> while (blub) {
>    str = "irgendwas"
> }```
> 
> immer das eine Objekt überschreibt.


hier wird das alte gleich zum Löschen greigegeben und das letzte existiert immer weiter

… solang die Methode aktiv ist.

Nehmen wir mal den Fall du hast ne endlos-Schleife, dann isses schon verdammt blöd wenn die Objekte erst nach dem Beenden der Schleife zum Löschen freigegeben werden oder? :wink:

nein der String in der Schleife ist nach jedem Durchlauf weg

   String str = "irgendwas";
}```
er erzeugt den String und nach bevor er oben überprüft ob er weiterlaufen soll wird alles was in dem String angelegt wurde (und nicht von wo anders referenziert wird) zum Vernichten freigegeben

```String str = null;
while (blub) {
   str = "irgendwas"
}```
hier wird es halt das letzte freigegeben und das neue draufgesetzt
abgesehn davon das beim Letzten noch das Letzte immer da ist verhalten sich beide absolut gleich

Das ist mir zwar neu, aber da ich mich damit noch nicht wirklich auseinander gesetzt hab, kauf ich dir das jetzt einfach mal so ab :stuck_out_tongue_winking_eye:

Hi,
auch wenn ich etwas spät dran bin, was die eigentliche Frage angeht, so doch noch ein paar Anmerkungen:

Also als erstes ist es doch schon mal ganz unsauber, dass du hier ein statisches Array verwendest, das public ist (schau dir mal die Idee der OOP und hier den Punkt Kapselung an).
Die andere Sache ist, dass du offensichtlich eine unbekannte Anzahl von Elementen hast. Da eignet sich ein Array so ziemlich gar nicht. Du könntest es zwar mit jedem Element vergrößern, aber das würde sehr sehr viel Overhead mit sich bringen, neues Objekt erzeugen (doppelt belegter Speicher), altes Array kopieren, neues Element einfügen, altes Array freigeben. Viel schöner geht das ganze mit einer Liste. Verwende einfach eine ArrayList oder irgendeine andere Implementierung des List Interface, da kannst du einfach ein Element anhängen. Intern wird da (zumindest bei der ArrayList) dann auch ein Array verwendet. Dies kümmert sich aber selbst um die Größenanpassung (es werden gleich eine Menge Zellen reserviert und aut. nach Füllung vergrößert/verkleinert).
Aber auch die muss man natürlich einmal erzeugen :wink:

Gruß Der Anmeldeboykottierer

objekte sind immer blockweise bekannt, d.h. wird ein objekt in einer Schleife angelegt, wird es auch beim verlassen der schleife zerstoert.

Daher ist

  String s = ....;
}```
besser als

String s = …;
for(int i = 0; i<x; i++) {
s = …;
}```
da im 2. fall s die ganze methode ueber bestehen bleibt (wenn die methode danach zu ende ist, ist es natuerlich schnuppe).

Wieder was gelernt :slight_smile: . Thx!

joa das sind sone Sachen die lernt man eigentlich nur inner Vorlesung/Unterricht weil das hab ich bisher in keinem Buch gesehen und daher wissen das viele Leute nicht

Aber müsste dann nicht die Methode “ich erstell in bei jedem Durchlauf nen neuen String” viel Performance-fressender seni als “Ich erstell mein Objekt vorher und überschreibe es nur jedesmal”? Weil bei Methode eins, wird ja in jeder Schleife ein neues Objekt erzeugt (Speicher zugewiesen) und am Ende wieder gelöscht (Speicher freigegeben) wohingegen Methode zwei das Objekt ja immer nur überschreibt. Oder täusche ich mich da?

du täuschst dich da, weil das s = “abc” ist im gewissen Sinne nichts anderes als s = new String(“abc”) und daher wird immer der Konstruktor aufgerufen und Speicher angefordert und am Ende freigegeben.
Das Einzigste wo ich mir nicht ganz sicher bin ist wie es sich mit der Variablen verhält ob das etwas Zeit kostet

Also wird bei s = “blub” nicht einfach der bereits zugewiesene Speicher überschrieben, sondern zum Löschen freigegeben und anschließend neuer angefordert!?

genau
Weil wenn du zB vorher “a” drin hattest und dann “abcdef” brauchst du ja auch viel mehr Platz und wenn danach was ist müsstest du laufend nachsehn wo gehts weiter und so packste einfach am Ende die neuen Daten rein und fertig

Hm, ercheint logisch :slight_smile: . OK, danke nochmal!