Stackoverflowerror

Snokes

Neues Mitglied
Hallo,
Ich probiere mich gerade an einer Aufgabe des BWINF bei der ich ein Problem mit einem Stackoverflowerror habe.
Vorab: Ich habe schon einen (vielleicht nicht perfekten) Ansatz und suche hier nur nach einer Lösung zu diesem Ansatz.
Zunächst einmal zur Aufgabe: Die Aufgabe ist Aufgabe 3 auf diesem Aufgabenblatt.
Es geht darum, dass man 3 Behälter mir Biebern hat, die aber auch in 2 Behälter passen würden.
ZUm Glück gibt es einen Telepator. Er funktioniert so:
Nehmen wir an im ersten Behälter sind a Bieber, im zweiten b Bieber. Zusätzlich gilt a<b.
Wenn man den Telepator nun auf diese 2 Behälter richtet, so befinden sich dannach im ersten Behälter a-b und im zweiten 2b Bieber.
Mithilfe dieses Verfahrens sollen in einem Behälter am Ende 0 Bieber sein.
Die Methode in der das Problem auftritt ist dazu da, die beste Lösung zu finden wenn nicht direkt vorhersehbar ist, was man machen soll.
Java:
private static LösungFürIdeal _BesteRandom(int[] arr)
    {
        //Zur Überprüfung was das Beste ist
        int besteZüge = Integer.MAX_VALUE;
        LösungFürIdeal lösung = null;

        if(Ideal(arr).getStatus()>0)
            return Ideal(arr);
        LösungFürIdeal[] lösungen = new LösungFürIdeal[3];
        //Zufällige Paare um Stackoverflow zu vermeiden
        //Speichert in einem 3*2 Array für die einzelnen Lösungen vom array lösungen 2 Indices, die getauscht werden
        int[][] paare = new int[3][2];
        Random r = new Random();
        //Schleife um alle 3 zu Befüllen
        //Da es für alles eine Möglichkeit gibt wird trotz Zufall das kürzeste herauskommen
        for(int i = 0; i< 3;i++)
        {
            do {
                try {
                    Thread.sleep(0);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //Array mit Länge 2 mit 2 Zufälligen ints von 0-2 befüllen(beide inklusive)
                int[] insert = new int[2];
                System.out.println("Zufallswerte:");
                insert[0] = r.nextInt(3);
                insert[1] = r.nextInt(3);
                System.out.println(insert[0]);
                System.out.println(insert[1]);
                //Wenn der eine int gleich dem anderen ist geht die Schleife weiter (man kann nicht einen index
                //mit sich selbst vertauschen
                if(insert[0]==insert[1])
                    continue;
                //Das Array wird der Größe der Werte nach sortiert
                Arrays.sort(insert);
                paare[i] = insert;
                boolean cond = true;
                for (int j = 0; j < 3&&cond; j++)
                {
                    if(i!=j)
                    {
                        System.out.println("ArrayVergleich:");
                        for(int k = 0; k < 2&&cond;k++)
                        {
                            System.out.println(paare[i][k]);
                            System.out.println(paare[j][k]);
                        }
                        if(Arrays.equals(paare[i],paare[j]))
                        {
                            System.out.println("Arrays GLEICH");
                            cond = false;
                        }
                        System.out.println("ARRAYS UNGLEICH");

                    }
                }
                System.out.println("SCHLEIFE BEENDET");
                break;
            }
            while(true);
            //Schleife oben wenn Die ZUfallswerte nicht die gleichen sind
            //Und wenn diese Zufallswerte nicht schjon so existieren
        }
        for (int i = 0; i < paare.length; i++)
        {
            //Ruft diese Methode mit einem Neuen Array auf
            //Die Rekursion geht so lange, bis irgendwann der Status > 0 ist
            lösungen[i] = _BesteRandom(Ändere(arr,paare[i][0],paare[i][1]));
        }
        //Hier wird aus den 3 Möglichen Tauschungen die Beste Ausgewählt
        for (LösungFürIdeal lo:lösungen)
        {
            lo.erhöheZüge();
            if(lo.getZüge()+lo.getZügeFürStatus()<besteZüge)
                lösung = lo;
        }
        //Und hier zurückgegeben
        return lösung;

    }

Kurz zur Klasse Lösug für Ideal.
Sie speichert zwei Integer ( Status und Züge) und ein Integer-Array(Lösung) der Status gibt an, wie einfach Lösung zu lösen ist. Höher ist besser und die Züge, wie viele Züge man dafür braucht.
Alle Variablen können mit Getter-Methoden abgerufen werden, einzig die Züge variable kann erhöht werden(immer nur um 1).
Exception in thread "main" java.lang.StackOverflowError
at sun.nio.cs.UTF_8$Encoder.encodeLoop(UTF_8.java:691)
at java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:579)
at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:271)
at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:125)
at java.io_OutputStreamWriter.write(OutputStreamWriter.java:207)
at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:129)
at java.io.PrintStream.write(PrintStream.java:526)
at java.io.PrintStream.print(PrintStream.java:669)
at java.io.PrintStream.println(PrintStream.java:806)
at Bwinfaufgabe3.Solve._BesteRandom(Solve.java:154)
at Bwinfaufgabe3.Solve._BesteRandom(Solve.java:197)
at Bwinfaufgabe3.Solve._BesteRandom(Solve.java:197)
at Bwinfaufgabe3.Solve._BesteRandom(Solve.java:197)
at Bwinfaufgabe3.Solve._BesteRandom(Solve.java:197)
usw.
*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at JPLISAgent.c line: 844
*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at JPLISAgent.c line: 844
*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at JPLISAgent.c line: 844

Process finished with exit code 1
Offensichtlich wird der Error durch das Aufrufen der Methode herbeigeführt.
Aber ich dachte, da ich immer Zufallswerte verwende, sollte es nicht zu diesem Error kommen.
Könnt ihr mir helfen?
Weitere Code-Schnipsel gerne auf Nachfrage, ich will euch nicht zumüllen;)

Danke schonmal,

snokes
 

mihe7

Top Contributor
Nehmen wir an im ersten Behälter sind a Bieber, im zweiten b Bieber. Zusätzlich gilt a<b.
Wenn man den Telepator nun auf diese 2 Behälter richtet, so befinden sich dannach im ersten Behälter a-b und im zweiten 2b Bieber.
Wenn ich mal davon ausgehe, dass es keine negative Anzahl an Biber gibt, dann wäre a >= 0 und b >= 0. Dann folgt aus a < b aber a - b < 0. D. h. im ersten Behälter gäbe es eine negative Anzahl an Biber => WTF?!?
 

Snokes

Neues Mitglied
Wenn ich mal davon ausgehe, dass es keine negative Anzahl an Biber gibt, dann wäre a >= 0 und b >= 0. Dann folgt aus a < b aber a - b < 0. D. h. im ersten Behälter gäbe es eine negative Anzahl an Biber => WTF?!?
Sorry habe wohl ein bisschen zu lange nach dem Fehler gesucht.

Wenn a<b gilt, dann sind nacher 2a im ersten und b-a im zweiten
Wenn a>b gilt, dann sind nacher 2b im zweiten und a-b im ersten
 

Ähnliche Java Themen

Neue Themen


Oben