Klassen Klassenvariable wird nicht gesetzt

kodela

Bekanntes Mitglied
Wie ich an anderer Stelle hier bereits beschrieben habe, verwende ich für ein Str8ts-Programm eine Klasse "STR8" zur Beschreibung der einzelnen Klassen. Diese Klasse verfügt auch über die boolsche Variable "geloest", die zunächst einmal mit "false" initialisiert ist.

Wird nun in einer der Auswertungsmethoden "geloest" auf "true" gesetzt, wirkt sich diese Änderung nur innerhalb der Methode auf. Bei einem erneuten Check, ob diese Instanz von STR8 bereits gelöst ist, ist "geloest" nicht wie erwartet auf "true" sondern auf "false" gesetzt.

Ich habe nun probiert, die Änderung von "geloest" für die Klasse STR8 über eine Klassen-Methode vorzunehmen, was leider auch nicht zum Erfolg führt.

Hier die Klasse "STR8" (mit der Zuweisungsmethode):
Java:
    /**
     * Klasse für die Definition einer Str8t durch die Positionsangabe
     * der jeweils ersten und letzten Zelle der Str8t, deren Länge und
     * ob sie gelöst ist
     */
    private class STR8 {
        ZPOS ezPos = null;
        ZPOS lzPos = null;
        int len = 0;
        boolean geloest = false;

        // Konstruktor
        public STR8() {
            this.ezPos = new ZPOS();
            this.lzPos = new ZPOS();
        }
       
        public void setGeloest(boolean isgeloest) {
            geloest = isgeloest;
        }
    }
Warum wird eine Änderung von "geloest" nicht übernommen?
 

VfL_Freak

Top Contributor
Moin,
Deine Variable 'geloest' ist so natürlich nur in der Klasse "STR8" bekannt!
Bastel Dir analog zu der Methode "setGeloest" die neue Methode "getGeloest", die Du dann an anderer Stelle aufrufen kannst ...

Wo wird "setGeloest" denn überhaupt aufgerufen ??

VG Klaus
 

JStein52

Top Contributor
Du könntest auch die Verwendung des Debuggers in Erwägung ziehen und dir z.B. an einem Haltepunkt in setGeloest(...) die Verhältnisse anschauen ...
 

kodela

Bekanntes Mitglied
wie fragst du es denn bisher ohne diese getter ab?
Alle Str8ts sind in einem eindimensionalen Array quasi als Liste zusammengefasst und werden über diese Liste, die so lange durchlaufen wird, bis entweder alle Str8ts gelöst sind oder kein Lösungsschritt mehr möglich ist, in Abhängigkeit ihrer Länge von speziellen Auswertmethoden ausgewertet. Um die Bearbeitung einer bereits gelosten Str8t zu umgehen, erfolgt die Abfrage vor dem Aufruf der Auswertungsmethode: Hier ein Codeschnipsel zum Aufruf:
Java:
        while (strList[i].len > 0) {
            geaendert = 0;

            switch (strList[i].len) {
                case 2:
                    if (!strList[i].geloest) {
                        geaendert += check2Str(strList[i]);                     
                    }
                    break;
                case 3:
                    if (!strList[i].geloest) {
                        geaendert += check3Str(strList[i]);                     
                    }
                    break;
               . . .

Wo wird "setGeloest" denn überhaupt aufgerufen ??
Der Aufruf von setGeloest() (oder die direkte Änderung von "geloest" erfolgt in der Auswertungsmethode, wenn feststeht, dass für die auszuwertende Str8t alle Werte gesetzt beziehungsweise alle leeren Zellen gelöst sind.

Übrigens prüfe ich meinen Mist schon mit dem Debugger und der zeigt mir, dass die Klassenvariable in der Auswertungsmethode gesetzt wird, aber dann bei der Auswertung der Liste nicht mehr gesetzt ist.
 
Zuletzt bearbeitet:

kodela

Bekanntes Mitglied
Welche Klassenvariable ? Gibts da noch was das "geloest" heisst ?
"geloest" in der Klasse STR8 (siehe hier). Und nein, es gibt keine weitere Variable, die "geloest" heißt.

Hier noch ein Beispiel, wie von einer der Auswertemethoden die Klassenvariable "geloest"der Klasse "STR8" gesetzt wird:
Java:
        if (glst) {
            str8t.setGeloest(glst);
        }
Ich könnte sie aber auch einfach mit "str8.geloest = true;" setzen.
 
Zuletzt bearbeitet:

VfL_Freak

Top Contributor
Moin,
hat es einen speziellen Grund, dass Du diesen beitrag hier noch verlinkst ???? :confused:

Außerdem: hast Du meinen Post #2 gelesen?
Deine Variable ist nur innerhalb der Klasse "STR8" bekannt!! Außerhalb NICHT !!

VG Klaus
 

kodela

Bekanntes Mitglied
hat es einen speziellen Grund, dass Du diesen beitrag hier noch verlinkst ???? :confused:

Außerdem: hast Du meinen Post #2 gelesen?
Deine Variable ist nur innerhalb der Klasse "STR8" bekannt!! Außerhalb NICHT !!
Einen besonderen Grund, ich weiß nicht, warum Du danach fragst. Wer im Kopf hat, was ich schon einmal erwähnt habe, der muss ja nicht auf den Link klicken.

Deinen Beitrag #2 habe ich sehr wohl gelesen. Ob ich daraus die richtigen Schlüsse gezogen habe, ist eine andere Frage. Ich bezweifle nicht, dass Deine Aussage, meine Variable sei nur innerhalb der Klasse "STR8" bekannt, richtig ist. Ich kann die Variable auf jeden Fall beim Debuggen sehen und ich kann auf alle anderen Daten, die mir diese Klasse referenziert, zugreifen und sie verändern. Warum das mit "geloest" zwar grundsätzlich möglich ist, aber die Änderung nur innerhalb der Methode, in der die Änderung vorgenommen wird, Bestand hat, das kann ich im Moment noch nicht verstehen.
 

VfL_Freak

Top Contributor
Moin,
Nicht ganz richtig. Da es sich bei der Klasse STR8 um eine private innere Klasse handelt ist die Variable auch in der äußeren Klasse sichtbar.
Ok, da hast Du natürlich Recht :oops:
Bleibt nur die Frage: welche äußere Klasse??? Zu sehen ist sie nicht!

Einen besonderen Grund, ich weiß nicht, warum Du danach fragst.
na ja, Du hättest auch einfach auf einen Deiner Post hier verweisen können ...

VG Klaus
 

kodela

Bekanntes Mitglied
Ich muss vielleicht noch ein Wort zu der Strukturierung sagen:
In der Auswertungsklasse "STR8TSAUSWERTUNG" habe ich das eindimensionale STR8-Array mit 60 Instanzen der Klasse STR8.

Dazu dieser Code:
Java:
private final STR8[] strList = new STR8[60];

    // im Konstruktor von "STR8TSAUSWERTUNG"
    for (int i = 0; i < strList.length; i++) {
        strList[i] = new STR8();
    }
    // dann werden die einzelnen Str8ts ermittelt und jeweils die 
       nächst Instanz einer STR8-Klasse wie folgt initialisiert
            strList[i].lzPos.zl = z;
            strList[i].lzPos.sp = s - 1;
            strList[i].len = s - lp;
    // in einer weiteren Methode wird nun die "strList" abgearbeitet
    // und jede Instanz individuell einer geeigneten Auswertemethode übergeben.
    // Ein Beispiel:

    if (!strList[i].geloest) {
        geaendert += check2Str(strList[i]);                       
    }

    // was aber so leider nicht wie gewünscht funktioniert, denn "geaendert"
    // ist immer "false".

    // In den Auswertemethoden habe ich in jedem Fall lesenden Zugriff auf
    // die Daten der STR8-Instanz, Referenzen auf ein zweidimensionales
    // Int-Array "strFeld" mit den Gesamtdaten der Str8ts-Aufgabe.
    // Auf diese Daten habe ich auch schreibenden Zugriff. Ein Beispiel:

        strFeld[zPos[1].zl][zPos[1].sp] = (knd | lwFlag | n2);

    // Von der STR8-Instanz selbst soll nur die Variable "geloest" geändert werden.
 

kodela

Bekanntes Mitglied
Mhmmm ok. Und was ist str8t
"str8t" ist der Bezeichner für die aktuell in Bearbeitung befindliche STR8-Instanz. Hier der Kopf der entsprechenden Auswertungsmethode:
Java:
private int check3Str(STR8 str8t) {
Der im Bild meines letzten Beitrages noch unvollendete Code sieht so aus:
Java:
    str8t.geloest = true;
Eine Zuweisung über setGeloest() würde am Ergebnis nichts ändern. Habe beides versucht.

Und jetzt noch ein Bild von der NetBeans-Überwachung nach der Zuweisung:
str8ts_02.png
Auch in der Methode, in welcher die Liste mit den Str8ts zur Auswertung abgearbeitet wird, sind die gesetzten geloest-Eigenschaften noch vorhanden. Erst wenn die Liste erneut durchlaufen wird, ist "geloest" wieder auf "false" gesetzt.
 

kodela

Bekanntes Mitglied
Gibts ja gar nicht. Und die anderen Attribute (len, ...etc.) sind noch richtig ?
Ja, genau so ist es.

Es gibt natürlich einen Unterschied zwischen der boolschen Variable "geloest" und allen anderen. Bei den vier Positionswerten, zwei für die erste, zwei die letzte Zelle einer Str8t und deren Länge ändert sich nichts mehr. Verändert werden nur die Werte, auf welche die Positionswerte zeigen und auch die Länge einer Str8t bleibt konstant. Es ändert sich nur die Eigenschaft "geloest".

Mittlerweile hatte ich den Verdacht, die Ursache des Problems könnte darin liegen, dass bei einem erneuten Aufruf der Auswertung auch die Erstellung der strList noch einmal mitläuft. Dies habe ich geändert, dass die Liste nur einmal erstellt wird. Bei einem erneuten Aufruf wird also an der Liste beziehungsweise den einzelnen Str8ts nichts mehr gemacht und trotzdem sind die gesetzten geloest-Flags weg.
 

JStein52

Top Contributor
Ja deshalb hatte ich gefragt weil ich auch dachte du erstellst aus Versehen eine neue Liste.
Hast du mal in irgendeiner Schleife stehen "if (...geloest = false)" Also ein = statt == ??
 

Harry Kane

Top Contributor
Deine Schilderungen sind ja schön und gut, aber ohne deine komplette Klasse mit allen Zeilen, bei denen auf die STR8 Instanzen zugegriffen wird, ist das hier nur ein Ratespiel.
 

kodela

Bekanntes Mitglied
. . . ohne deine komplette Klasse mit allen Zeilen, bei denen auf die STR8 Instanzen zugegriffen wird, ist das hier nur ein Ratespiel.
Ist schon klar, bevor ich aber den kompletten Code hier poste (über 900 Zeilen) werde ich mich selbst noch weiter mit der Suche nach der Ursache beschäftigen. Einige Umstellungen habe ich bereits vorgenommen.
Sollte ich meinem Problems auf die Spur kommen, anders gesagt, den von mir gemachten Fehler finden, werde ich mich auf jeden Fall hier wieder melden. Einstweilen bedanke ich mich bei allen, die mir helfen wollten oder durch Denkanstöße bereits auch geholfen haben.
 

mrBrown

Super-Moderator
Mitarbeiter
Du kannst mit'm Debugger einen Breakpoint auf Variablen (bzw den Setter) setzen, dann siehst du wo sie geändert wird.

Ich würde spontan auf verschiedene Instanzen in unterschiedlichen Schleifendurchläufen
 

kodela

Bekanntes Mitglied
Du kannst mit'm Debugger einen Breakpoint auf Variablen (bzw den Setter) setzen, dann siehst du wo sie geändert wird.
Ich würde spontan auf verschiedene Instanzen in unterschiedlichen Schleifendurchläufen
Ja danke! Sehr nützlich ist auch die Überwachungsfunktion von NetBeans. Im Augenblick muss ich mich allerdings um eine zweite "Baustelle" kümmern. Wenn ich wieder Luft habe, werde ich mich aber auf die Suche machen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Klassenvariable wird nicht überschrieben. Allgemeine Java-Themen 5
J Variablen Scanner als Klassenvariable Allgemeine Java-Themen 5
D String und Klassenvariable Allgemeine Java-Themen 6
P static Klassenvariable Allgemeine Java-Themen 15
J Lebensdauer einer Klassenvariable Allgemeine Java-Themen 3
N Lwjgl 3d Objekt wird schmaler, wenn es sich dreht Allgemeine Java-Themen 0
D Linux, Java-Version wird nicht erkannt bzw. welche Einstellung fehlt noch? Allgemeine Java-Themen 19
berserkerdq2 Wenn ich einfach eine GIF in den Scenebuilder als Bild reinpacke, wird das dann asl Gif angezeigt Allgemeine Java-Themen 1
G Popup wird nicht sichtbar Allgemeine Java-Themen 9
8u3631984 Funktions Parameter mit Lombok "NonNull" annotieren wird in Jacococ Testcoverage nicht herausgefiltert Allgemeine Java-Themen 3
M Java Überprüfen ob .exe-Datei bereits ausgeführt wird Allgemeine Java-Themen 2
Calli11 Was muss ich hier in die Main schreiben, damit das Programm ausgeführt wird? Allgemeine Java-Themen 4
Sachinbhatt Wie wird die Typumwandlung bei Mehrfachvererbung in Java implementiert? Allgemeine Java-Themen 3
Y MVVM wie wird Eventhandler tausch geregelt Allgemeine Java-Themen 4
berserkerdq2 run-methode eines Threads so programmieren, dass 30x die Sekunde etwas ausgeführt wird. Allgemeine Java-Themen 44
T ImageIcon wird nicht angezeigt Allgemeine Java-Themen 6
N Warum wird die For Schleife nicht betreten Allgemeine Java-Themen 4
N warum wird es doppelt ausgegeben Allgemeine Java-Themen 6
A code wird nicht ausgeführt Allgemeine Java-Themen 3
Y Warum wird das JLabel falsch verschoben? Allgemeine Java-Themen 1
T Schaltfläche wird nicht gefunden Allgemeine Java-Themen 4
N Eingabe wird immer als "false" ausgegeben Allgemeine Java-Themen 6
D Firebase retrieve data Problem, Child Element wird nicht angesprochen Allgemeine Java-Themen 0
M Frage-Antwortspiel wie Wer wird Millionär Allgemeine Java-Themen 1
Zrebna Gibt es eine Möglichkeit eine NPE zu vermeiden, wenn null returned wird? Allgemeine Java-Themen 3
R Warum wird mir in der Konsole das "Standard Array" ausgegeben? Allgemeine Java-Themen 2
C FileLock - Exception wird immer geworfen Allgemeine Java-Themen 4
R Was muss ich ändern, damit der Kreis links unten gezeichnet wird? Allgemeine Java-Themen 17
hello_autumn Java_Home geändert auf Java 13, trotzdem wird Java Version 8 angezeigt. Allgemeine Java-Themen 2
Thallius Char +1 wird int? Allgemeine Java-Themen 7
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
F Scrollbar wird nicht angezeigt Allgemeine Java-Themen 0
B Discord Bot - Funktion wird nicht aufgerufen Allgemeine Java-Themen 1
I Temp-Datei wird nicht gelöscht Allgemeine Java-Themen 12
S If-Menü wird doppelt ausgegben Allgemeine Java-Themen 4
P Variable wird in for - loop nicht richtig hochgezählt Allgemeine Java-Themen 11
S Wird bei den JREs 9, 10, 11+ ueberhaupt noch Bytecode ausgefuehrt..? Allgemeine Java-Themen 8
FRI3ND JFrame wird nicht angezeigt Allgemeine Java-Themen 3
T Plötzlich wird package nicht mehr gefunden Allgemeine Java-Themen 3
X Klassen File-Klasse wird als Directory markiert Allgemeine Java-Themen 8
S Datei wird nicht gefunden Thread.currentThread().getContextClassLoader().getResourceAsStream() Allgemeine Java-Themen 1
mrbig2017 Sleep wird ignoriert und der Thread wartet nicht Allgemeine Java-Themen 1
mrbig2017 Threads wait wird nicht durch notify beendet! Allgemeine Java-Themen 3
M Was geschieht mit Java-Klasse, die aus ArrayList entfernt wird? Allgemeine Java-Themen 10
kodela Drücken der ALT-Taste wird nur bei jedem zweiten Mal erkannt Allgemeine Java-Themen 5
Arif Input/Output Serialisierung - Datei wird nicht erzeugt Allgemeine Java-Themen 3
D Cursor unsichtbar, wenn Kontextmenü aufgerufen wird Allgemeine Java-Themen 5
K Arbeitsspeicher wird langsam voll Allgemeine Java-Themen 6
The Pi Wie oft wird ein Buchstabe in einem Wort wiederholt? Allgemeine Java-Themen 16
N Datentypen If-Statement wird "übersprungen" Allgemeine Java-Themen 2
F Java Mail Problem: Authentifizierung wird nicht immer mitgeschickt Allgemeine Java-Themen 1
T Textarea text wird immer überschrieben Allgemeine Java-Themen 4
C Durch klicken von Button in GUI wird leeres Fenster geöffnet und nicht mein Spiel "Memory" Allgemeine Java-Themen 13
T Java wird nicht gefunden Allgemeine Java-Themen 32
Tacofan GIF-Bild wird "zerstört" Allgemeine Java-Themen 3
Z Exception wird nicht ausgelöst Allgemeine Java-Themen 2
Sin137 Interface Eingabe wird doppelt angezeigt Allgemeine Java-Themen 2
B Threads Timer wird immer schneller Allgemeine Java-Themen 6
N Maven ObjectMapper Error wenn das File gespeichert wird Allgemeine Java-Themen 0
G Methoden Aus einem Event, wo ich weiß, dass es ausgeführt werden wird, eine Get-Methode basteln Allgemeine Java-Themen 8
F Wert in Variable schreiben, wenn diese gerade genutzt wird Allgemeine Java-Themen 10
E Java wird beendet nach paar Sekunden Allgemeine Java-Themen 14
U Erkennen, ob PC benutzt wird Allgemeine Java-Themen 4
O Programm wird einfach "gekillt" Allgemeine Java-Themen 3
P Prüfen ob es Variable mit Namen gibt der als String übergeben wird Allgemeine Java-Themen 7
P Zwei ArrayLists: Ohne die eine überhaupt anzurühren, wird sie verändert Allgemeine Java-Themen 2
B Abfragenteil wird nicht aufgerufen Allgemeine Java-Themen 2
Todesbote JFileChooser im Vordergrund (*.jar wird mittels shell_exec in PHP aufgerufen) Allgemeine Java-Themen 1
T Sicherheitshinweis - Zertifikat wird angefordert Allgemeine Java-Themen 5
L SetBounds wird vor dem Konstruktorcode aufgerufen - Wenn Startleiste links Allgemeine Java-Themen 1
P "Overriden statische Methode" Statische Methode die vererbt wird Allgemeine Java-Themen 5
I CountDown wird durch JOptionPane unterbrochen Allgemeine Java-Themen 11
P Wird double und float auf jedem Computer gleich berechnet? Allgemeine Java-Themen 10
G Tabelle wird nicht richtig dargestellt Allgemeine Java-Themen 9
HarleyDavidson Threads ProgressMonitor wird nicht angezeigt! Allgemeine Java-Themen 6
J OOP Überwachen, ob ein Objekt erzeugt wird Allgemeine Java-Themen 9
S Byte Array welches in Laufzeit aufgelöst wird // Objekt Array Allgemeine Java-Themen 3
A Long variable wird negativ??? Allgemeine Java-Themen 1
J CSV Datei wird ungewollt umformatiert Allgemeine Java-Themen 5
T MEthodenauruf testen, wenn instanz erst erzeugt wird Allgemeine Java-Themen 0
gamebreiti Swing JLabel wird nicht angezeigt Allgemeine Java-Themen 4
I Java Applet wird immer blockiert Allgemeine Java-Themen 3
E Java Editor Klasse wird nicht weiter ausgeführt Allgemeine Java-Themen 4
S Java Applet wird dauerhaft blockiert Allgemeine Java-Themen 1
I Datei wird nicht richtig gelöscht Allgemeine Java-Themen 7
K Methoden Objekt wird nicht erkannt Allgemeine Java-Themen 11
D Input/Output Datei wird lokal aber nicht vom Webserver ausgelesen... Allgemeine Java-Themen 2
F Nach Export wird PDF Datei nicht mehr gefunden Allgemeine Java-Themen 0
L Prüfen, ob Programm über 32bit oder 64bit Java ausgeführt wird Allgemeine Java-Themen 4
D ActionListener wird mit jedem Mal öfter aufgerufen Allgemeine Java-Themen 2
C System.in erhält Input von Tastatur. wo wird das festgelegt? Allgemeine Java-Themen 4
I Projekt wird nicht erstellt Allgemeine Java-Themen 2
T WeakReference/PhantomReference: Mitbekommen WELCHES Objekt nun GC'ed wird Allgemeine Java-Themen 2
A Threads Log4J Logger wird "überschrieben" Allgemeine Java-Themen 3
P Check, welche Java Version installiert bevor ein Programm ausgeführt wird. Allgemeine Java-Themen 12
J batch datei wird nicht aufgerufen Allgemeine Java-Themen 11
M Datei wird nicht vollständig geschrieben (FileOutputStream, OutputStreamWriter, Encoding) Allgemeine Java-Themen 6
P OSGi - Bundle-Methode wird nicht aufgerufen Allgemeine Java-Themen 3
S Antlr Grammatik übersetzt ohne Fehler, dennoch wird Zahl nicht als Eingabe erkannt Allgemeine Java-Themen 4
T Variablen Variable wird als nicht genutzt angezeigt Allgemeine Java-Themen 8

Ähnliche Java Themen

Neue Themen


Oben