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?
 
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
 
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 ...
 
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:
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:
Moin,
hat es einen speziellen Grund, dass Du diesen beitrag hier noch verlinkst ???? 😕

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

VG Klaus
 
hat es einen speziellen Grund, dass Du diesen beitrag hier noch verlinkst ???? 😕

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.
 
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 😳
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
 
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.
 
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.
 
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.
 
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 == ??
 
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.
 
. . . 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.
 
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
 
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.
 

Neue Themen


Zurück
Oben