Fehler in der Matrix

Klatz

Grünschnabel
Hallo Leute

Ich hab letztens für das kommende Fachgespräch eine Aufgabe geübt, die rekursiv den Durchnitt eines Arrays berechnet. Ich hab ein Programm geschrieben, das genau nur einmal funktioniert. Wenn du z.B. {7,11,9,23,2} als Eingabe spezifizierst, gibt er mir 10,4 aus. Versuche ich aber ein zweites mal das Programm auszuführen, wirft er mir eine Exception aus.

class Einmal{
static int Zähler = 0;
static double Ergebnis = 0;
static double mittelWert(double[] Werte){
Ergebnis = Ergebnis + Werte[Zähler];
Zähler++;
if(Zähler == Werte.length){

return Ergebnis/Werte.length;
}
else{
return mittelWert(Werte);
}
}
}

Anscheinend liegt das daran, dass die Variablen Ergebnis und Zähler nicht zurückgesetzt werden. Sollte das eigentlich nicht immer automatisch geschehen?

PS.: Wenn jemand ein paar coole Aufgaben kennt, die rekursiv mit Arrays gelöst werden müssen kann er ja die mal posten.....
 
Und wie sieht die Exception aus?

Ps.: Ist zwar gut, dass du Tags verwendest, aber du solltest auch entsprechend den Code einrücken und die CODE-Tags verwenden!
 
ArrayIndexOutOfBoundsException
2

Beim nächsten mal rücle ich ein. Aber bei der größe sollte es noch überschaubar sein...
 
Hallo,

es wäre nicht schlecht, wenn du die ganze Exception posten würdest.

Was meinst du mit zwei mal das Programm starten?

MFG

Sascha
 
Beim nächsten mal rücle ich ein. Aber bei der größe sollte es noch überschaubar sein...
Gewöhn es dir lieber gleich an!

Die Exception dürfte doch klar sein oder? Sie bedeutet, dass du auf einen Index des Array zugreifen willst, der über der Grenze liegt. Du solltest nach dem ersten Durchlauf den Zähler wieder auf 0 setzen.
 
Code:
java.lang.ArrayIndexOutOfBoundsException: 3
	at A.mittelWert(A.java:5)
java.lang.ArrayIndexOutOfBoundsException: 3
	at A.mittelWert(A.java:5)
java.lang.ArrayIndexOutOfBoundsException: 2
	at A.mittelWert(A.java:5)
java.lang.ArrayIndexOutOfBoundsException: 2
	at A.mittelWert(A.java:5)
java.lang.ArrayIndexOutOfBoundsException: 5
	at A_b.mittelWert(A_b.java:5)
java.lang.ArrayIndexOutOfBoundsException: 3
	at rekursivJan.mittelWert(rekursivJan.java:5)
java.lang.ArrayIndexOutOfBoundsException: 2
	at tEinmal.mittelWert(tEinmal.java:5)
java.lang.ArrayIndexOutOfBoundsException: 3
	at tEinmal.mittelWert(tEinmal.java:5)

Das ist die ganze Exception... Ich weiß ja schon, wo das Problem ist. Nach dem ich das Programm beende, löscht er die Variable Zähler nicht, weswegen beim nächsten Start des Programms Zähler nicht auf 0 gesetzt ist und er eine ArrayIndexOutOfBounds wirft.

Die Frage ist. Warum? Sowas ist mir zum ersten mal passiert.....
 
Gleiche Frage wie Sascha:
Meinst du mit Programm neu starten dass du die Funktion wieder benutzt oder die JavaVM beendest du das Programm ganz neu ausführst?
 
Es würde schon helfen, wenn du die Variablen Zähler und Ergebnis in der Methode deklarierst.

Du hast aber immer noch nicht gesagt, was du mit 2 mal das Programm starten meinst. Wenn du das Programm nämlich wirklich ein zweites mal starten würdest, würde sicherlich dieser Fehler nicht kommen.

MFG

Sascha
 
Weil die Variable Zähler eine static Variable ist. Das heißt die Variable bezieht sich auf das Objekt, aber nicht die Variablen, die du aus der Klasse erstellst.

Daher ist Sie für alle Instanzen (also alle vorhandenen/nicht vorhandenen Variablen) gültig.

Ich hoffe du hast es verstanden^^
 
Gewöhn es dir lieber gleich an!

Keine Sorge. Ich weiß nur zu gut, warum Einrückungen sinnvoll sind. Ich saß mal mehrere Stunden an einem 100 Zeilen Programm und verzweifelte daran, warum dieses verdammte Ding nicht ging. Erst nachdem ich das Programm komplett neu geschrieben habe und sinnvolle Einrückungen benutzte konnte ich die Fehler ausmerzen...

Ich hab halt Quote und nicht Code genommen, weswegen die Einrückungen nicht übernommen worden sind....

Die Exception dürfte doch klar sein oder? Sie bedeutet, dass du auf einen Index des Array zugreifen willst, der über der Grenze liegt. Du solltest nach dem ersten Durchlauf den Zähler wieder auf 0 setzen.

Dat klappt nicht. Ich muss Ergebnis auch wieder auf 0 setzten, und das verursacht einen äußerst hässlichen Code:

Code:
class tImmer {
     static int Zähler = 0;
     static int Zähler2 = 0;
     static double Zähler3 = 0;
     static double Ergebnis = 0;
     static double mittelWert(double[] Werte){
         Ergebnis = Ergebnis + Werte[Zähler];
         Zähler++;
         if(Zähler == Werte.length){
             Zähler2 = Zähler; 
             Zähler3 = Ergebnis;
              Zähler = 0;
              Ergebnis = 0;
              return Zähler3/Werte.length;
         }
         else{
             return mittelWert(Werte);
        }
    }
}
 
Zurück