Methoden Wert einer Variable geht verloren?

Midazolam

Mitglied
Hi,

ich versuche es mal allgemein zu halten, bevor ich hier Code poste, möchte die Aufgabe so weit wie möglich selbst schaffen.
Prinzipiell geht es um eine Methode, die zählen soll, wie oft ein Wert z.B. 2 in einem Array vorkommt und dann je nachdem ob der Wert gerade oder ungerade ist true oder false zurückgeben.

Dazu benutzt ich eine Hilfsmethode, die rekursiv sein muss. Prinzipiell läuft es gut und die Variable "counter" zählt hoch wie sie soll, doch am Ende kommt immer "0" raus. Im Debug Modus behält counter solange ihren Wert, bis es wieder in die eigentlich Methode geht und ohne Zwischenschritt ist counter einfach wieder "0", es findet keine neue Wertzuweisung statt.

Woran kann das liegen?
 
Beste Antwort
K
Deine helper Methode gibt den counter zurück und mit der Rückgabe musst du natürlich etwas machen. Derzeit ignorierst Du, was die Methode zurück gibt.

Edit:
- Um es noch einmal deutlich zu schreiben: Counter ist "nicht wieder" 0. Counter der Methode war immer 0 und wurde nie geändert!
- Parameter werden per Call by Value übergeben, d.h. wenn Du da counter übergibst, wird nur der Wert aus Counter übergeben. Eine Änderung des Parameters ändert also nicht die Variable, die als Parameter angegeben wurde.
Da ist so pauschal nichts zu sagen bzw. es würde das Forum sprengen.
- lokale Variablen gehen komplett verloren, wenn der Block, in dem sie sind, verlassen wird.
- Instanzvariablen sind an eine Instanz gebunden. Eine andere Instanz bedeutet andere Variable. (Kofferraum eines Autos: Da kannst Du was rein tun, aber wenn Du ein neues Auto kaufst, dann ist der Kofferraum leer und enthält natürlich nicht, was du bei einem anderen Auto in den Kofferraum getan hast).
- Parameter sind generell Call by Value. Darüber ist also eine Variable nicht zu ändern.

Was das konkret bei Deinem Code bedeutet, ist schwer zu sagen. Du hast Rekursion erwähnt: So counter eine lokale Variable ist, ist die also in jedem Aufruf neu. Wenn der Wert wichtig ist, kannst Du diesen z.B. zurück geben um den Wert dann zu speichern.
 
Kommt mir sehr bekannt vor die Aufgabenstellung 😀 Bei mir sind das ganze so aus:

Java:
public class Functionality {


    public static void main(String[] args) {

        System.out.println(evenNumberOf(1, new int[] {1,2,3,2}));

    }

    public static boolean evenNumberOf(int n, int[] array) {

        int i = 0;
        int counter = 0;

        if ((array.length == 0) || (array == null))
            return false;

        if (array.length > 0) {

            helper(array, i, counter, n); // nachdem die Hilfsmethode durch ist und wieder hier landet ist counter wieder = 0.

            if ((counter % 2) == 0) {
                return true;
            } else return false;

        }
        return false;

    }

    public static int helper(int[] array, int i, int counter, int n) {


        if (i > array.length) return 0;

        if (i < array.length) {

            if (array[i] == n) {
                return helper(array, ++i, ++counter, n);

            } else return helper(array, ++i, counter, n);

        }

        return counter;

    }




}
 
Deine helper Methode gibt den counter zurück und mit der Rückgabe musst du natürlich etwas machen. Derzeit ignorierst Du, was die Methode zurück gibt.

Edit:
- Um es noch einmal deutlich zu schreiben: Counter ist "nicht wieder" 0. Counter der Methode war immer 0 und wurde nie geändert!
- Parameter werden per Call by Value übergeben, d.h. wenn Du da counter übergibst, wird nur der Wert aus Counter übergeben. Eine Änderung des Parameters ändert also nicht die Variable, die als Parameter angegeben wurde.
 
Beste Antwort

Zurück
Oben