Variablen Array-Variable verändert sich

Nemesys88

Bekanntes Mitglied
Guten Tag!

Ich arbeite zur Zeit an einer Java/Swing-Applikation bei der ich auf folgendes Problem gestoßen bin:

Zunächst etwas Code (habe den Code in einem Testprojekt komprimiert um das Problem eingrenzen zu können):
Java:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class Data {
	
	private Modul modulcontainer[] = new Modul[50];
	private Modul modul = new Modul();

	public void read() {
		
		File f = new File("output.csv");
		
		try {
			if (f.exists())
			{
				BufferedReader reader = new BufferedReader(new FileReader(f));
				
				String buffer;
				int i = 0;
	
				while ((buffer = reader.readLine()) != null) {
					
				    String[] results = buffer.split("#");

				    String part1 = results[0];
				    Integer part2 = Integer.parseInt(results[1]);
			    
					modul.setName(part1);
					modul.setPunkte(part2);
					
					modulcontainer[i] = modul;
			
					System.out.println("Vorher: " + modulcontainer[i].getName() + " i = " + i);
					
					i++;	 
				}
				
				for (int k= 0; k<5; k++) {
				System.out.println("Nachher:  " + modulcontainer[k].getName() + " k = " + k);
				}
				
				reader.close();
		
			} 

		} catch (IOException e1) {
			e1.printStackTrace();
		}
		
	}
	
	
}

Die Main.java ruft nurnoch
Java:
		Data daten = new Data();
		daten.read();
auf, die Modul.java ist quasi leer also zu ignorieren...

Es geht darum, dass der Wert des Arrays "modulcontainer" per Getter - Funktion in einer anderen Klasse aufgerufen werden soll.

Das Problem: Die Test-Ausgaben:

Vorher: Kolloquium i = 0
Vorher: Abschlußarbeit i = 1
Vorher: Englisch i = 2
Vorher: Mathe i = 3
Vorher: Java i = 4
Nachher: Java k = 0
Nachher: Java k = 1
Nachher: Java k = 2
Nachher: Java k = 3
Nachher: Java k = 4

zeigen, dass sich die Werte im Array verändern:
Während in der while-Schleife noch die richtigen Werte vorhanden sind (Kolloquium,Abschlußarbeit,Englisch,Mathe,Java) so hat das Array "modulcontainer" unmittelbar nach der while-Schleife 5x den Wert (Java).

Ich verstehe nicht wirklich, warum und an welcher Stelle das passiert.

Bitte um Erleuchtung. 🙂

mfG
 
Zuletzt bearbeitet von einem Moderator:
Oh.. da hätt ich echt selber drauf kommen müssen, aber ich hab's nicht gesehen... vllt. brauch ich grad mal ne Pause oder so... 😀

Oben geändert in private Modul modul; und in jedem Schleifendurchlauf modul = new Modul(); und das Problem war natürlich sofort behoben...

Ich bedanke mich! 🙂
 
Zuletzt bearbeitet:
Ich habe noch Bauchschmerzen bei der Zeile:

Java:
modulcontainer[i] = modul;

Obwohl rechts und links des Gleichheitszeichens Objekte der Klasse Modul stehen, kann man das so nicht zuweisen, meine ich mich zu erinnern. Besser ist hier die anwendung einer Methode

Java:
public class Modul{
...
copy( Modul m){
this.name=m.name;
this.punkte=m.punkte;
}
 
Zuletzt bearbeitet von einem Moderator:
Im Gegenteil, man muss aufpassen bei Arrays auf Objekte
Java:
private Modul modulcontainer[] = new Modul[50];
denn hier wird nur Platz für 50 Referenzvariablen ("Pointer") geschaffen, nicht 50 Modul-Objekte angelegt. Man muss noch für jeden Array-Eintrag ein 'new' aufrufen und abspeichern.
 
Hehe ja, genau das passiert dann auch... modul = new Modul(); modul.setName.... usw. und dann modulcontainer = modul; das ist soweit auch alles kein Problem 😉

Aber hätt noch ne andere Frage und ich mach das mal hier um keinen neuen Thread eröffnen zu müssen:

Ich hab in der Klasse A ein label, das ich in Klasse D aber gerne updaten würde... jetzt könnt ich das übergeben das müsst ich aber über mehrere Klassen machen was sehr kompliziert wäre.

Mein Label sieht so aus:

Java:
		label1 = new JLabel();
		label1.setText(("Summe ECTS: " + daten.berechne_summe() + "               " + "Notendurchschnitt: " +  Math.round( daten.berechne_durchschnitt() * 100. ) / 100.));
		label1.setHorizontalAlignment(SwingConstants.CENTER);
		label1.setBorder(new LineBorder(Color.BLACK));
		add(label1,BorderLayout.SOUTH);

Daten ist die Klasse die das Label aktualisieren soll.

Hab dem label jetzt nen ActionListener mit Timer verpasst, der alle 10 Sekunden "daten.berechne_summe()" aufruft was nicht grade schön gelöst ist, wie ich finde.
Konnte durch googlen keine Lösung finden die funktioniert hat...

Was würdet ihr mir da vorschlagen ?
 
Zuletzt bearbeitet von einem Moderator:
  • Entweder den Weg "durch mehrere Klassen" (gemeint ist hoffentlich "durch mehrere Objekte") eben doch gehen,
  • oder das umgebende (J)Frame in einer globalen Variable speichern, und ihm eine Methode getLabelXYZ verpassen. Dann kann der Zugriff-Benötigende etwas machen à la
Java:
void method1() {
  JLabel theLabel ;
  theLabel = CHauptProgramm.mainWindow.getLabelXYZ() ;
  theLabel.____ ;
}
Noch besser ist, dem 'mainWindow' dann eine Methode zu verpassen, die nicht einfach das Label "rausrückt", sondern genau das anbietet, was du machen möchtest, z.B.
Java:
void method1() {
  CHauptProgramm.mainWindow.updatePlayerScore( player1.getPoints() );
}
Und selbige Methode setzt dann
theLabel.setCaption( "" + score );
anstatt dass eine "Benutzer-Klasse" da direkt rumwerkelt.
Kommt aber drauf an, ob/wie man MVC oder ähnliches einsetzt.
 
Hm.. danke.. leider komm ich immernoch nicht weiter...

das Label müsst ich echt von Klasse A > Klasse B > Klasse C > Klasse D schieben (natürlich geht es immer um objekte) damit es dort endlich bekannt ist, das find ich irgendwie nicht gut....

Und man hat mir beigebracht, nicht mit globalen Variablen zu arbeiten...

Ich habs jetzt mit nem Observer versucht, das hat aber leider nicht wirklich funktioniert...

Hab jetzt was von Eventbus gelesen, das werd ich nachher nochmal ausprobieren... wenn nicht jemand bis dahin noch was einfacheres vorschlägt... 🙂

Danke erstmal.
 
Aber hätt noch ne andere Frage und ich mach das mal hier um keinen neuen Thread eröffnen zu müssen:

Wenn du eine Frage zu einem anderen Thema hast dann bitte einfach einen neuen Thread aufmachen (im richtigen Bereich).
Niemand wird anhand des Thread Titel vermuten dass das eigentliche Problem gelöst ist und es nun um JLabels geht.
 

Zurück
Oben