# Fehlerhaftes Laufzeitverhalten



## panicupdate (26. Jul 2016)

Hallo,
Ich habe folgende Aufgabe :
Die nachfolgenden Programme sind syntaktisch korrekt und compilierbar, führen aber zu
einem fehlerhaften Laufzeitverhalten. Geben Sie die Art des auftretenden Fehlers an und
erklären Sie kurz, wodurch er verursacht wird!

```
// 1.
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 });
   }
}
```
Ich hätte jetzt gesagt es würde eine NegativeArraySizeException auftreten, da ja immer wieder ein kleineres Feld args erzeugt wird, bis die Größe negativ werden würde.
Tja, stimmt aber nicht...
Der Fehler der zuerst auftritt ist die Endlosschleife, weil die while Bedingung nie falsch wird.
Mir ist nicht einleuchtend warum dieser Fehler vor der NegativeArraySizeException auftritt, kann mir da vielleicht jemand auf die Sprünge helfen?


----------



## CSHW89 (26. Jul 2016)

```
args = feld - 3;
```
Das steht so definitiv nicht da. Liegt daran, dass der Code eine Formatierung verursacht hat. Das passiert, wenn man keine Code-Tags verwendet.


----------



## panicupdate (26. Jul 2016)

Entschuldigung, ich kenne mich weder in diesem Forum noch mit Java aus.
Nun, da auf wundersame Weise jetzt das da steh, was ich meinte, könnte mir jemand mit meinem Problem helfen? 
vielen Dank im Voraus und liebe Grüße


----------



## Joose (26. Jul 2016)

CSHW89 hat gesagt.:


> ```
> args = feld - 3;
> ```
> Das steht so definitiv nicht da. Liegt daran, dass der Code eine Formatierung verursacht hat. Das passiert, wenn man keine Code-Tags verwendet.



Schon angepasst 

Zu dem Problem: Du könntest einen Schreibtischtest machen.
Du hast recht das "doSomething" immer mit einen kleineren Array aufgerufen wird. Aber wenn das Array die Länge 0 hat dann wird die Schleife gar nicht betreten.


----------



## panicupdate (26. Jul 2016)

Ah! jetzt habe ich es entdeckt, vielen Dank!


----------



## VfL_Freak (26. Jul 2016)

Moin,


```
while (feld.length > 0)
    doSomethingOther(feld);
```
ist deswegen eine Endloseschleife, weil sich die Länge von 'feld' ja nie ändert !!
Gruß Klaus


----------



## Xyz1 (26. Jul 2016)

Man braucht nur 3 Zeilen sehen,

```
public static void doSomething(int[] feld) {
     while (feld.length > 0)
       doSomethingOther(feld);
```

um festzustellen, dass es sich um eine Endlosschleife handelt.

Der Inhalt, jedoch nicht die Länge (da immutable) kann innerhalb einer andern Methode geändert werden.

Arrays sind fixe Behälter, schneller Zugriff auf Elemente und Änderungen, das war's dann aber auch schon.

TO: Lass mich raten, du stehst auch vor einer schwierigen Prüfung und die Uhr schlägt schon halb Sechs???


----------



## CSHW89 (26. Jul 2016)

DerWissende hat gesagt.:


> um festzustellen, dass es sich um eine Endlosschleife handelt.


Das schon. Es reicht aber nicht, um sagen zu können, dass die Endlosschleife zum Fehler führt. Würde die erste Zeile in "doSomethingOther" z.b.

```
int[] args = new int[feld.length - 2];
```
 lauten, gäbe es eine Exception durch Erstellen eines Arrays mit negativer Größe. Die beiden Funktionen rufen sich gegenseitig auf mit dem zuvor neu erstellen kleineren Array.


----------



## Xyz1 (26. Jul 2016)

Du hast recht, in dem Fall, träte die Exception vor einem StackOverflow auf! Folgerung: Ich hab nicht alles gelesen.


----------

