Interpreter-Fehler Endlosschleife zur Laufzeit aber warum?

SafeDebagger

Mitglied
Java:
public class LaufzeitFehler1 {

    public static void doSomething(int[] feld) {
        while (feld.length > 0)
        doSomethingOther(feld);
    }
   
    public static void doSomethingOther(int[] feld) {
        int[] args = new int[feld.length - 1];
        for (int i = 0; i < args.length; i++)
            args[i] = feld[i] - 3;
        doSomething(args);
    }

    public static void main(String[] args) {
        doSomething(new int[] { 1, 2, 3 });
    }
}

Dieses Programm liefert zur Laufzeit eine Endlosschleife. Leider bin ich trotz mehrmaligem drüberschauen nicht fündig geworden, weshalb dieses Problem auftritt bzw. wo genau. Im beiligenden Lösungsskript ist lediglich angegeben, dass die while-Schleife immer true bleibt, da die doSomethingOther()-Methode keine Änderung in der anderen MEthode schafft. Jedoch ist es doch so, dass args an doSomething() übergeben wird und damit nach einigen Schleifendurchläufen die Länge = 0 wird und somit enden müsste :/

Bitte um Hilfe
 
Zuletzt bearbeitet von einem Moderator:

juergenkulow

Mitglied
Hallo SaveDebagger,
Bash:
E:\>javac LaufzeitFehler1.java
LaufzeitFehler1.java:13: error: bad operand types for binary operator '-'
            args = feld - 3;
                        ^
  first type:  int[]
  second type: int
1 error
 

mihe7

Top Contributor
@juergenkulow das kommt nur daher, wenn man den Code zunächst nicht in Code-Tags packt. Dann wird [i] entfernt und von der Forensoftware als kursiv interpretiert - darum ist der Text nach seinem Code auch kursiv gesetzt :)
 

juergenkulow

Mitglied
Hallo SaveDebagger,

Java:
public class LaufzeitFehler1 {
    static int zeilen=0;
    static int stack=0;
    public static void doSomething(int[] feld) {
    System.out.printf("Stack:%d Start doSomething\n",stack); // doSomething wird 3x mehr aufgerufen als beendet.
        while (feld.length > 0) { // Endlos, weil die feld.lenght in Schleife nicht kleiner wird.
            if (zeilen==7)
                System.exit(1);
            else
                zeilen=zeilen+1;
            System.out.printf("Rufe doSomethingOther auf feld.length:%d feld[0]:%d\n", feld.length,feld[0]);
            stack=stack+1;
            doSomethingOther(feld);
            stack=stack-1;
        }
        System.out.printf("Stack:%d Return doSomething\n",stack);
    }
  
    public static void doSomethingOther(int[] feld) {
        int[] args = new int[feld.length - 1];
        System.out.printf("Stack:%d Erzeuge neues int-Feld mit der Laenge: %d\n",stack, args.length);
        for (int i = 0; i < args.length; i++)
            args[i] = feld[i] - 3;
        //System.out.printf("Rufe doSomething auf args.length:%d feld[0]: %d \n", args.length,feld[0]);
        stack=stack+1;
        doSomething(args);
        stack=stack-1;
        //System.out.printf("Vernichte int-Feld mit der Laenge: %d \n",args.length);
    }

    public static void main(String[] args) {
        stack=stack+1;
        doSomething(new int[] { 1, 2, 3 });
    }
}
/*
E:\>java LaufzeitFehler1
Stack:1 Start doSomething
Rufe doSomethingOther auf feld.length:3 feld[0]:1
Stack:2 Erzeuge neues int-Feld mit der Laenge: 2
Stack:3 Start doSomething
Rufe doSomethingOther auf feld.length:2 feld[0]:-2
Stack:4 Erzeuge neues int-Feld mit der Laenge: 1
Stack:5 Start doSomething
Rufe doSomethingOther auf feld.length:1 feld[0]:-5
Stack:6 Erzeuge neues int-Feld mit der Laenge: 0
Stack:7 Start doSomething
Stack:7 Return doSomething
Rufe doSomethingOther auf feld.length:1 feld[0]:-5
Stack:6 Erzeuge neues int-Feld mit der Laenge: 0
Stack:7 Start doSomething
Stack:7 Return doSomething
Rufe doSomethingOther auf feld.length:1 feld[0]:-5
Stack:6 Erzeuge neues int-Feld mit der Laenge: 0
Stack:7 Start doSomething
Stack:7 Return doSomething
Rufe doSomethingOther auf feld.length:1 feld[0]:-5
Stack:6 Erzeuge neues int-Feld mit der Laenge: 0
Stack:7 Start doSomething
Stack:7 Return doSomething
Rufe doSomethingOther auf feld.length:1 feld[0]:-5
Stack:6 Erzeuge neues int-Feld mit der Laenge: 0
Stack:7 Start doSomething
Stack:7 Return doSomething

E:\>

*/
Java:
public class LaufzeitFeld {
    public static void mydoSomething(int[] feld) {
        int[] args;
        for (int j=feld.length; j>0 ; j--) {
            for (int i=0; i<feld.length; i++)
                System.out.printf("Feld[%d]:%2d ",i,feld[i]);
            System.out.println();
            args = new int[feld.length -1];
            for (int i = 0; i < args.length; i++)
                args[i] = feld[i] - 3;
            mydoSomething(args);
        }
    }

    public static void main(String[] args) {
        mydoSomething(new int[] { 1, 2, 3 });
    }
}

/*
E:\>java  LaufzeitFeld
Feld[0]: 1 Feld[1]: 2 Feld[2]: 3
Feld[0]:-2 Feld[1]:-1
Feld[0]:-5
Feld[0]:-2 Feld[1]:-1
Feld[0]:-5
Feld[0]: 1 Feld[1]: 2 Feld[2]: 3
Feld[0]:-2 Feld[1]:-1
Feld[0]:-5
Feld[0]:-2 Feld[1]:-1
Feld[0]:-5
Feld[0]: 1 Feld[1]: 2 Feld[2]: 3
Feld[0]:-2 Feld[1]:-1
Feld[0]:-5
Feld[0]:-2 Feld[1]:-1
Feld[0]:-5

E:\>
*/
 

SafeDebagger

Mitglied
Hallo SaveDebagger,

Java:
public class LaufzeitFehler1 {
    static int zeilen=0;
    static int stack=0;
    public static void doSomething(int[] feld) {
    System.out.printf("Stack:%d Start doSomething\n",stack); // doSomething wird 3x mehr aufgerufen als beendet.
        while (feld.length > 0) { // Endlos, weil die feld.lenght in Schleife nicht kleiner wird.
            if (zeilen==7)
                System.exit(1);
            else
                zeilen=zeilen+1;
            System.out.printf("Rufe doSomethingOther auf feld.length:%d feld[0]:%d\n", feld.length,feld[0]);
            stack=stack+1;
            doSomethingOther(feld);
            stack=stack-1;
        }
        System.out.printf("Stack:%d Return doSomething\n",stack);
    }

    public static void doSomethingOther(int[] feld) {
        int[] args = new int[feld.length - 1];
        System.out.printf("Stack:%d Erzeuge neues int-Feld mit der Laenge: %d\n",stack, args.length);
        for (int i = 0; i < args.length; i++)
            args[i] = feld[i] - 3;
        //System.out.printf("Rufe doSomething auf args.length:%d feld[0]: %d \n", args.length,feld[0]);
        stack=stack+1;
        doSomething(args);
        stack=stack-1;
        //System.out.printf("Vernichte int-Feld mit der Laenge: %d \n",args.length);
    }

    public static void main(String[] args) {
        stack=stack+1;
        doSomething(new int[] { 1, 2, 3 });
    }
}
/*
E:\>java LaufzeitFehler1
Stack:1 Start doSomething
Rufe doSomethingOther auf feld.length:3 feld[0]:1
Stack:2 Erzeuge neues int-Feld mit der Laenge: 2
Stack:3 Start doSomething
Rufe doSomethingOther auf feld.length:2 feld[0]:-2
Stack:4 Erzeuge neues int-Feld mit der Laenge: 1
Stack:5 Start doSomething
Rufe doSomethingOther auf feld.length:1 feld[0]:-5
Stack:6 Erzeuge neues int-Feld mit der Laenge: 0
Stack:7 Start doSomething
Stack:7 Return doSomething
Rufe doSomethingOther auf feld.length:1 feld[0]:-5
Stack:6 Erzeuge neues int-Feld mit der Laenge: 0
Stack:7 Start doSomething
Stack:7 Return doSomething
Rufe doSomethingOther auf feld.length:1 feld[0]:-5
Stack:6 Erzeuge neues int-Feld mit der Laenge: 0
Stack:7 Start doSomething
Stack:7 Return doSomething
Rufe doSomethingOther auf feld.length:1 feld[0]:-5
Stack:6 Erzeuge neues int-Feld mit der Laenge: 0
Stack:7 Start doSomething
Stack:7 Return doSomething
Rufe doSomethingOther auf feld.length:1 feld[0]:-5
Stack:6 Erzeuge neues int-Feld mit der Laenge: 0
Stack:7 Start doSomething
Stack:7 Return doSomething

Erstmal vielen lieben Dank. Ich verstehe alles bis auf den Schritt, wo das erste Mal nach "Stack:7 Return doSomething" wieder die doSomethingOther()-Methode aufgerufen wird. Diese "Stack:7..." Ausgabe konnte ja erst erfolgen, weil die while-Schleife nicht erfüllt war, damit die feld.length nicht mehr >0 ist und somit auch nirgends mehr der Aufruf nach doSomethingOther kommt.

Mir ist klar, ich hab irgendwo einen mächtigen Denkfehler aber ich bekomme ihn leider einfach nicht raus. Sorry...
 

SafeDebagger

Mitglied
Hä? Die Länge von Arrays ist nicht veränderbar. Drücke ich mich so missverständlich aus?

Das ist ja klar, aber mir gehts darum, dass wenn args als Argument an doSomething übergeben wird, wurde ja die Länge für die Methode verändert, da die vorherigen Anfangskomponenten ja nun gelöscht wurden wegen dem Laufzeitsgedöns...
Dass ein Array nicht seine Länge ändern kann, ist 100% klar, aber es geht mir darum welche Felder bleiben und welche gelöscht sind, nachdem eine andere MEthode aufgerufen wurde
 

mihe7

Top Contributor
Dass ein Array nicht seine Länge ändern kann, ist 100% klar, aber es geht mir darum welche Felder bleiben und welche gelöscht sind, nachdem eine andere MEthode aufgerufen wurde
Ich wiederhole mich:
feld wird nicht geändert. Folglich bleibt feld.length stets größer 0.

Am besten machst Du Dir das erstmal an zwei verschiedenen Methoden klar:

Java:
void a(String x) {
   b(x);
   System.out.println(x);
}
void b(String x) {
    x = "";
}

Was wird ausgegeben, wenn Du a("XYZ") aufrufst?
 

mihe7

Top Contributor
mihe, ich glaub der Lerneffekt ist gerade verpufft, weil Du die Frage falsch gestellt hast. :(
Er wollte ja keine tiefgreifende Erklärung und für den Zweck sollte es reichen :)

@SafeDebagger richtig. Du kann in b() also an das x zuweisen, was Du willst, das wirkt sich in a() nicht aus.

Wenn Du jetzt diesen Code nimmst:
Java:
    public static void doSomething(int[] feld) {
        while (feld.length > 0)
        doSomethingOther(feld);
    }
Dann kannst Du in doSomethingOther an feld zuweisen, was Du willst, es wird sich in doSomething() nicht auswirken. Die Variable feld ändert sich also nicht und da Arrays, wie @Tobias-nrw bereits erwähnt hat, in ihrer Länge nicht veränderbar sind, wird feld.length immer größer 0 bleiben (sofern es ursprünglich größer 0 war, versteht sich).
 

mihe7

Top Contributor
Sinn macht das erst, wenn etwas mehr über den Hintergrund bekannt ist :)

Ich versuche es mal wieder einfach: Java übergibt Parameter immer als Kopie (call by value) des zu übergebenden Werts. Bei primitiven Datentypen wie int etc. wird direkt der betreffende Wert kopiert. Bei Objekten dagegen wird nicht das Objekt selbst sondern nur eine Referenz (=Speicheradresse) darauf kopiert. In Java sind Arrays spezielle Objekte.

Daher kannst Du zwar eine übergebene Variable nicht ändern (die Zuweisung an x in b() wirkt sich nicht auf die übergebene Variable aus), aber - da das selbe(!) Objekt nur referenziert wird - wirken sich Änderungen am Objekt gleichermaßen aus.

Wichtig zu wissen ist noch, dass jeder Methodenaufruf separat behandelt wird, somit einen eigenen Satz an Parametern und lokalen Variablen erhält. Damit sollte auch klar werden, wie bzw. wieso rekursive Aufrufe funktionieren.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Hilfe bei Endlosschleife Java Basics - Anfänger-Themen 2
B In einem Thread Endlosschleife beenden Java Basics - Anfänger-Themen 19
noah1407 endlosschleife Java Basics - Anfänger-Themen 7
G Endlosschleife keine Rückgabe Java Basics - Anfänger-Themen 36
sserio Endlosschleife ja nein? Java Basics - Anfänger-Themen 13
javapingu Endlosschleife bei User Input mit try Scanner Java Basics - Anfänger-Themen 7
B Endlosschleife Thread sauber beenden Java Basics - Anfänger-Themen 19
S While-Schleife geht in Endlosschleife über, warum? Java Basics - Anfänger-Themen 6
O Endlosschleife abbrechen Java Basics - Anfänger-Themen 10
S Endlosschleife beim Ausgeben einer LinkedList Java Basics - Anfänger-Themen 2
T Erste Schritte Endlosschleife & wozu braucht man /* und */ Java Basics - Anfänger-Themen 19
J Endlosschleife bei Try-Catch? Java Basics - Anfänger-Themen 3
S Endlosschleife - Warum? Java Basics - Anfänger-Themen 1
C Endlosschleife bei füllen von Daten im JTable Java Basics - Anfänger-Themen 5
C Collatzfolge endlosschleife. Java Basics - Anfänger-Themen 4
D Array in Endlosschleife überschreibt vorherige Werte Java Basics - Anfänger-Themen 4
E Eulersche Zahl berechnen, Endlosschleife Java Basics - Anfänger-Themen 2
N Endlosschleife... Warum? Java Basics - Anfänger-Themen 12
P Kapselung Problem - Endlosschleife Java Basics - Anfänger-Themen 10
M Endlosschleife bricht durch switch ab Java Basics - Anfänger-Themen 17
D Endlosschleife und ich komme nicht raus! Java Basics - Anfänger-Themen 8
N Erste Schritte Endlosschleife und Exception Java Basics - Anfänger-Themen 5
R Endlosschleife nach InputMismatchException Java Basics - Anfänger-Themen 2
S Endlosschleife? Java Basics - Anfänger-Themen 2
T Endlosschleife Java Basics - Anfänger-Themen 2
Z Endlosschleife Java Basics - Anfänger-Themen 6
T Endlosschleife Java Basics - Anfänger-Themen 12
H Wieso ist das eine Endlosschleife? Java Basics - Anfänger-Themen 8
StupidAttack Endlosschleife, Sockets Java Basics - Anfänger-Themen 2
C ungewollte Abbrüche in einer Endlosschleife Java Basics - Anfänger-Themen 6
E komische endlosschleife Java Basics - Anfänger-Themen 6
7 Endlosschleife pausieren Java Basics - Anfänger-Themen 11
F .readLine() erzeugt endlosschleife Java Basics - Anfänger-Themen 4
R Wieso hänge ich hier in einer Endlosschleife (vermute ich zumindest)? Java Basics - Anfänger-Themen 2
F Falscheingabe abfangen - Endlosschleife Java Basics - Anfänger-Themen 5
R warum endlosschleife? Java Basics - Anfänger-Themen 7
W Fakultät, warum Endlosschleife? Java Basics - Anfänger-Themen 15
S JTable Endlosschleife Java Basics - Anfänger-Themen 5
J Aus endlosschleife kommen Java Basics - Anfänger-Themen 5
R Endlosschleife verhindert das Schließen des Fensters Java Basics - Anfänger-Themen 10
Povlsen84 Endlosschleife Java Basics - Anfänger-Themen 5
V Bubble Sort endet in Endlosschleife Java Basics - Anfänger-Themen 4
Antoras Endlosschleife Java Basics - Anfänger-Themen 8
J Wartezustand in Endlosschleife - bessere Alternativen Java Basics - Anfänger-Themen 20
H Problem beim Einlesen einer Datei (Endlosschleife ?) Java Basics - Anfänger-Themen 3
N Endlosschleife? Java Basics - Anfänger-Themen 3
V mehrere Threads starten + Endlosschleife Java Basics - Anfänger-Themen 3
I Hilfe wer findet mein Fehler in bei der Endlosschleife Java Basics - Anfänger-Themen 7
G Sound/Endlosschleife/Abbruchproblem Java Basics - Anfänger-Themen 3
G HappyNumbers - Endlosschleife Java Basics - Anfänger-Themen 11
0 Endlosschleife beim Integer Array mischen? Java Basics - Anfänger-Themen 3
M OutputStream funktioniert nur in Endlosschleife ? Java Basics - Anfänger-Themen 4
G Endlosschleife, aber warum? Java Basics - Anfänger-Themen 12
G Endlosschleife beenden Java Basics - Anfänger-Themen 10
Detlef Bosau Nachladen von Klassen zur Laufzeit Java Basics - Anfänger-Themen 24
E Alter (Laufzeit) berechnen Java Basics - Anfänger-Themen 11
W Array zur Laufzeit bearbeiten? Java Basics - Anfänger-Themen 31
D Objekterzeugungen mit zur Laufzeit variierenden Attributen Java Basics - Anfänger-Themen 7
J GroupLayout zur Laufzeit erweitern Java Basics - Anfänger-Themen 1
B Übersetzungszeit und Laufzeit Java Basics - Anfänger-Themen 3
amgadalghabra Die vier Sortieralgorithmen die durchschnittliche Laufzeit in Millisekunden Java Basics - Anfänger-Themen 37
U Dijkstra Algorithmus Laufzeit Java Basics - Anfänger-Themen 3
S Laufzeit Quicksort wenn alle Elemente gleich sind Java Basics - Anfänger-Themen 4
L Anzahl der Elemente key in einem Array mit log(N) Laufzeit Java Basics - Anfänger-Themen 4
J JavaFX Label,Button zur Laufzeit Java Basics - Anfänger-Themen 30
H Laufzeit Java Basics - Anfänger-Themen 11
C Laufzeit eines Sortier-Algorithmus ermitteln Java Basics - Anfänger-Themen 4
L Objekt Typ zur Laufzeit ermitteln Java Basics - Anfänger-Themen 1
J Datei im Package zur Laufzeit editieren Java Basics - Anfänger-Themen 1
M Quicksort Laufzeit langsam Java Basics - Anfänger-Themen 5
M Quicksort Laufzeit langsam Java Basics - Anfänger-Themen 0
R Objekte zur Laufzeit in Schleife erzeugen und in ArrayList ablegen Java Basics - Anfänger-Themen 4
C Laufzeit von Stack Operation Java Basics - Anfänger-Themen 5
D Laufzeit von einfachem Programm Java Basics - Anfänger-Themen 21
J Laufzeit berechnen/Laufzeitanalyse Java Basics - Anfänger-Themen 2
M Input/Output Datei in Laufzeit-JAR kopieren Java Basics - Anfänger-Themen 6
V Laufzeit Java Basics - Anfänger-Themen 23
G Laufzeit/ O/Θ-Notation einer Treeset Methode Java Basics - Anfänger-Themen 0
W Klassen [GELÖST] Objekte während der Laufzeit mit neuen veränderten Werten beliebig oft initialisieren Java Basics - Anfänger-Themen 2
M Erste Schritte Code zur Laufzeit ändern lassen Java Basics - Anfänger-Themen 3
C Klassen aus einem Package ermitteln und per Laufzeit laden Java Basics - Anfänger-Themen 17
J Objekte zur Laufzeit erzeugen und direkt verwenden Java Basics - Anfänger-Themen 9
M Möglich? Methode aufrufen deren Bezeichner zur Laufzeit durch einen überg. String festgelegt wird Java Basics - Anfänger-Themen 3
K JLabel zur Laufzeit dynamisch erzeugen Java Basics - Anfänger-Themen 7
M Methoden miteinander verbinden (Laufzeit) Java Basics - Anfänger-Themen 6
llabusch Interface Layout eines Labels während der Laufzeit ändern Java Basics - Anfänger-Themen 0
Streeber reale Laufzeit meines Programms ausgeben Java Basics - Anfänger-Themen 1
D Algorithmus zu gegebener Laufzeit implementieren Java Basics - Anfänger-Themen 1
R Variablen Datentyp erst während Laufzeit festlegen Java Basics - Anfänger-Themen 6
S Klassentyp zur Laufzeit ändern? Java Basics - Anfänger-Themen 3
M Laufzeit und O-Notation Java Basics - Anfänger-Themen 3
M Variablen Variable zur Laufzeit erzeugen Java Basics - Anfänger-Themen 3
A Laufzeit von verschachtelter for-Schleife Java Basics - Anfänger-Themen 4
B Variablen Instanz von Enum zur Laufzeit erstellen und zuweisen Java Basics - Anfänger-Themen 2
L Panels zur Laufzeit ändern Java Basics - Anfänger-Themen 2
A Laufzeit Java Basics - Anfänger-Themen 11
M Methodennamen zur Laufzeit ausgeben Java Basics - Anfänger-Themen 5
F JTable zur laufzeit füllen Java Basics - Anfänger-Themen 7
P GUI - Layout per Laufzeit erstellen/verändern? Java Basics - Anfänger-Themen 6
N Variablen VariableNamen auswirkung auf Laufzeit Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben