3 oder 4 Fehler im Code

helloworld14

Mitglied
Hey,
ich hänge derzeit echt auf dem Schlauch.

Ich habe einen Code in dem 3 oder 4 Fehler (muss man herausfinden) versteckt sind.
Ich verstehe aber echt nicht was da schief läuft.

Damit ihr mir das nicht vorsagt und ich es selber verstehen möchte, würde ich das gerne kooperativ oder mit Erklärungen lösen.

Wenn ich den Code ausführe mit der Anzahl 3 beim Wert den man eingeben kann, dann kommt der Fehler:

java.lang.ArrayIndexOutOfBoundsException: 3
at FehlerhafteListeStudis.main(FehlerhafteListeStudis.java:36)

Ich würde gern versuchen den Code in Worte zu schreiben, damit ihr mich verbessern könnt, falls ich etwas falsch verstehe. Ich möchte es wirklich verstehen und es ist auch simpel, jedoch stehe ich noch ganz am Anfang mit Java daher Sorry, falls ich es nicht direkt verstehe.

Was ich schon mal verstehe, wir geben ein wie viele Studenten es gibt per intEingabe.
Wir wollen ein String Array und die länge soll die anschließende int Eingabe sein.
Dann ein 2 Prints. Und eine For Schleife.
Ich weiß, dass ein Array bei dem Index 0 beginnt. Die For Schleife fängt hier jedoch bei 1 an.
Ist das legitim?
Sie wird so lange ausgeführt, bis i größer ist, als die Anzahl der Objekte im namen Array richtig?
Es wird immer +1 hinzugefügt.
Dann ein Print ausdruck jedoch bin ich mir nicht ganz sicher ob ich das darauffolgende richtig verstehe?
Im NamenArray wird die Anzahl der Objekte im namenArray - 1 gerechnet, sobald man einen Namen eingibt.
Aber was mach das anzStudis++? Erhöht es die Anzahl der Objekte im new String[anzStudis]??
Danach kommen wieder 2 Prints und eine For Schleife.
Diese fängt bei 0 an. Ist das schon einer der Fehler?
Weil die erste for Schleife bei 1 und die 2te bei 0 anfängt?
Die Schleife geht so lange wie i kleiner/gleich anzStudis ist. Und wird auch immer um +1 erhöht. Am Ende wirds geprinted.

Der Fehler java.lang.ArrayIndexOutOfBoundsException: 3, der erscheint, wenn ich 3 am Anfang bei der intEingabe erscheint ist mir relativ schlüssig. Nach dem ich dann 2 Namen eingebe kommt die Fehlermeldung.
Wenn ich in die intEingabe 2 Eingebe, kommt der Fehler schon nach einem Namen.
Also scheint da was mit dem Zählen nicht zustimmen.
Scheint ja so als wenn Java den ersten oder zweiten Index des Arrays überspringt bzw an einem falschen Startwert anfängt und somit außerhalb der Range des Arrays kommt.
Könnte das sein?


public class FehlerhafteListeStudis {
public static void main(String[] args) {
System.out.println("-- StudiVerwaltung --");
System.out.println();
System.out.print("Anzahl Studis? ");
int anzStudis = Eingabe.intEinlesen();
String[] namen = new String[anzStudis];
System.out.println();
System.out.println("* Eingabe der Namen");
for (int i = 1; i < namen.length; i = i + 1) {
System.out.print("Name des " + (i) + ". Studis: ");
namen[namen.length - i] = Eingabe.stringEinlesen();
anzStudis++;
}
System.out.println();
System.out.println("* Liste der Studis");
for (int i = 0; i <= anzStudis; i += 1) {
System.out.println(namen);
}
}
}


Sorry für den ellen langen Text und vielen Dank für jede Hilfe!!!
 
Die erste for Schleife die bei 1 beginnt ist kein wirklicher Fehler. Kann man so machen. Aber macht im Zusammenhang mit Arrays wenig Sinn.
Ich habe jetzt den Code mal überflogen und mir fällt auf das die Länge der Studis Liste der Wert ist der vorhin als int eingeben wurde, auch die Bedingung in der Schleife ist.
Dazu muss man wissen, dass Array mit 0 anfangen und n-1 enden.
Java:
String[} = new String[3];
String[0];
String[1];
String[2];
Also wär der Fehler eins, die for Schleife die bei 1 und nicht 0 beginnt und zwei und drei die Bedingung der Schleife - müsste anzStudis -1 - heißen.
 
Java:
public class FehlerhafteListeStudis {

    public static void main(String[] args) {
        System.out.println("-- StudiVerwaltung --");

        System.out.println();
        System.out.print("Anzahl Studis? ");
        int anzStudis = Eingabe.intEinlesen();

        String[] namen = new String[anzStudis];

        System.out.println();
        System.out.println("* Eingabe der Namen");

        for (int i = 1; i < namen.length; i = i + 1) {
            System.out.print("Name des " + (i) + ". Studis: ");
            namen[namen.length - i] = Eingabe.stringEinlesen();
            anzStudis++;
        }

        System.out.println();
        System.out.println("* Liste der Studis");
        for (int i = 0; i <= anzStudis; i += 1) {
            System.out.println(namen[i]);
        }
    }

}
 
Die erste for Schleife die bei 1 beginnt ist kein wirklicher Fehler. Kann man so machen. Aber macht im Zusammenhang mit Arrays wenig Sinn.
Ich habe jetzt den Code mal überflogen und mir fällt auf das die Länge der Studis Liste der Wert ist der vorhin als int eingeben wurde, auch die Bedingung in der Schleife ist.
Dazu muss man wissen, dass Array mit 0 anfangen und n-1 enden.
Ja genau, das meinte ich auch so also Fehler 1 hätte ich auch verstanden.

Also wär der Fehler eins, die for Schleife die bei 1 und nicht 0 beginnt und zwei und drei die Bedingung der Schleife - müsste anzStudis -1 - heißen.
Wo müsste es anzStudis -1 heißen?Bei anzStudis++?

Habe jetzt beide For Schleifen auf i = 0 eingestellt, also das sie bei 0 starten.
Wenn ich jetzt einen intWert bspw. 3 eingebe, kommt nach dem ersten Namen direkt :
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
Also, wenn ich das richtig verstanden habe, dann ist ein weiterer Fehler bei anzStudis. In der ersten For Schleife oder ?
 
Wie @temi schon sagt, mal von vorne anfangen.
Als Tipp.
Die Bedingung der Schleife, das Einlesen des Strings, und das anzStudis++.
 
Zuletzt bearbeitet:
Vergiss das erst mal.

okay

Du weißt, was dieser Fehler bedeutet?

Ja, wenn mich nicht alles täuscht, dann versucht Java auf ein ungültigen Index zuzugreifen!

Dann muss der Fehler ja in der ersten Schleife sein (und zwar beim Zugriff auf ein Array)
Ja genau das ist mir bewusst.
Nur verstehe ich nicht ganz, was den Fehler verursacht.

Ich gebe den intWert 3 an und dann startet ersten schleife bei i = 0 (habe ich von i = 1 auf 0 geändert, weil Arrays ja bei 0 anfangen) nun geht die Schleife solange bis i größer als die Anzahl der Objekte im Array ist, welche ja dann größer als 3 sein muss.
Ich finde einfach nicht den Punkt, an dem die Fehlermeldung gerechtfertigt wird, sprich, wann der Index ungültig ist.
 
Ja, wenn mich nicht alles täuscht, dann versucht Java auf ein ungültigen Index zuzugreifen!

Ja genau das ist mir bewusst.
Nur verstehe ich nicht ganz, was den Fehler verursacht.

Wie viele Stellen gibt es hier, wo auf ein Array zugegriffen wird?
Java:
        for (int i = 0; i < namen.length; i = i + 1) {
            System.out.print("Name des " + (i) + ". Studis: ");
            namen[namen.length - i] = Eingabe.stringEinlesen();
            anzStudis++;
        }

Findest du den Index sinnvoll? Wenn ja, warum?

Geh mal den Ablauf im Kopf (oder auf einem Papier) durch.
 
Zuletzt bearbeitet:
Nur in der For Schleife wird auf das Array zugegriffen oder wie war die Frage gemeint?

Ja der Index macht mMn theoretisch Sinn, denn ein Array beginnt immer beim Index 0.
Wenn ich nun int 3 Eingebe sieht das so aus
name [0]
name[1]
name[2], ab hier gilt die Bedingung der For Schleife i < name.length NICHT mehr.

Wenn der Index Jedoch bei 0 anfängt, dann steht in der Konsole
'Name des 0. Schülers', was relativ wenig Sinn macht. könnte man aber einfach fixen.

Was eher unlogisch ist.
Unsere namen.lenght ist doch die intEingabe oder?
In der For Schleife ist die Bedingugn i <namen.length. i wird immer 1 erhöht aber namen.length wird ja einen verringert. Das macht doch keinen Sinn? Bsp. mit 3

i =0 < 3 check daraus wird dann doch
i = 1 < 2 check
Und danach geht es ja gar nicht mehr weiter! Hier wäre doch der ungültige Index oder ?

EDIT: Ah ich sehe, er erhöht ja immer weiter die Anzahl der Studenten. Das soll ja gar nicht passieren. mit anzStudis-- crashed es nicht mehr jedoch gibt er keine Namen aus, was logisch ist, da dies im Konflikt mit der zweiten ForSchleife steht.
 
Zuletzt bearbeitet:
Noch eine Anmerkung und ich hoffe, dass sie dich nicht zu sehr verwirrt:
Im ursprünglichen Programm wird das Array von "rückwärts" befüllt.
der Index macht mMn theoretisch Sinn
Hier wird auf ein Element des Arrays zugegriffen namen[namen.length - i]
Wenn i == 0 und namen.length == 3, dann rechne doch mal aus, auf welches Element des Arrays.

Und wieviele Elemente hat das Array?

Was ist dann der höchste mögliche Index, wenn das Array mit 0 beginnt?
 
namen.lenght ist doch die intEingabe oder?
namen.length gibt die deklarierte Arraylänge zurück, in diesem Fall 3.
namen.length wird ja einen verringert
Es wird etwas von namen.length abgezogen, aber das ändert nichts am Wert von namen.length.

Kurzes Beispiel dazu:
Java:
int x = 5;
x + 5; // es wird zwar 5 addiert, aber das Ergebnis bleibt ungenutzt
x = x + 1; // hier wird 1 addiert und das Ergebnis in der ursprünglichen Variablen gespeichert (= überschrieben)

Das soll ja gar nicht passieren.
Korrekt. Das ist ein Fehler. Die Zeile ist komplett überflüssig.
mit anzStudis-- crashed es
Das ist auch ein Fehler.
 
Noch eine Anmerkung und ich hoffe, dass sie dich nicht zu sehr verwirrt:
Im ursprünglichen Programm wird das Array von "rückwärts" befüllt.
Ja das kam mir auch in den Sinn. Bin nur noch niccht ganz sicher wie ich damit umgehen muss.
Hier wird auf ein Element des Arrays zugegriffen namen[namen.length - i]
Wenn i == 0 und namen.length == 3, dann rechne doch mal aus, auf welches Element des Arrays.
Dann wird ja aufs dritte Element zugegriffen (3-0=3) und das Array müsste doch 3 Elemente haben oder ? Weil namen.length 3 ist.
Was ist dann der höchste mögliche Index, wenn das Array mit 0 beginnt?
Was ist dann der höchste mögliche Index, wenn das Array mit 0 beginnt?
2, weil 0,1,2 oder?
Es wird etwas von namen.length abgezogen, aber das ändert nichts am Wert von namen.length.

Kurzes Beispiel dazu:
vielen dank für das Beispiel!
Korrekt. Das ist ein Fehler. Die Zeile ist komplett überflüssig.
hab sie auskommentiert in Eclipse
Das ist auch ein Fehler.
schon gemerkt 😀
 
Ja das kam mir auch in den Sinn. Bin nur noch niccht ganz sicher wie ich damit umgehen muss.
Der erste Fehler passiert beim "Befüllen" des Arrays (ursprünglicher Code) und wird auch sofort bei der Eingabe der Namen erkennbar (es lassen sich nur zwei Namen eingeben, bevor die Schleife beendet wird). Eine Möglichkeit, diesen Fehler zu beheben ist den Startindex auf Null zu setzen (i=0 => das hast du gemacht), aber dann muss noch etwas anderes angepasst werden, weil die Berechnung des höchsten Index falsch ist. Die zweite Möglichkeit ist, den Endindex zu verändern, so dass die Schleife nicht zu früh beendet wird.

Nur zur Vollständigkeit:
Die dritte Möglichkeit wäre die Schleife rückwärts laufen zu lassen, aber dann muss der angezeigte Index bei der Eingabe der Namen berechnet werden, damit nicht als erstes "Bitte geben Sie den 3. Namen ein:" dasteht.

Die vierte Möglichkeit wäre es das Array von vorne zu befüllen, kommt aber darauf an, ob das so gewünscht ist.
 
Zuletzt bearbeitet:
Rate mal, welche Fehlermeldung du erhältst, wenn du auf ein Element zugreifen möchtest [3], das nicht existiert?

Wahrscheinlich diesen :
java.lang.ArrayIndexOutOfBoundsException: 3

Der erste Fehler passiert beim "Befüllen" des Arrays (ursprünglicher Code) und wird auch sofort bei der Eingabe der Namen erkennbar (es lassen sich nur zwei Namen eingeben, bevor die Schleife beendet wird). Eine Möglichkeit, diesen Fehler zu beheben ist den Startindex auf Null zu setzen (i=0 => das hast du gemacht), aber dann muss noch etwas anderes angepasst werden, weil die Berechnung des höchsten Index falsch ist.
Genau! Möchte auch gern diese Möglichkeit benutzen. Start Index habe ich auf i = 0.


Die vierte Möglichkeit wäre es das Array von vorne zu befüllen, kommt aber darauf an, ob das so gewünscht ist.
Wir sollen die Fehler finden und beheben.

Nur mal als Breakpoint.
Der erste Fehler, war das anzStudis++ dieses habe ich auskommentiert.
Der zweite Fehler war, dass der Index bei 1 anfing. Diesen habe ich auf 0 gesetzt.
Der dritte Fehler ist, dass die Berechnung des höchsten Index, welche noch falsch ist nicht wahr?

Java:
for (int i = 0; i < namen.length; i = i + 1) {
            System.out.print("Name des " + (i) + ". Studis: ");
            namen[namen.length - 1] = Eingabe.stringEinlesen();
            // anzStudis++; // unnötige zeile
        }

        System.out.println();
        System.out.println("* Liste der Studis");
        for (int i = 0; i <= anzStudis; i += 1) {
            System.out.println(namen[i]);
        }
    }

}

so sieht es derzeit aus. Ich überlege, an welcher Stelle ich etwas ändern muss, damit der höchstmögliche Index passt.
Wenn ich 3 eingebe, ist ja der höchstmögliche Index 2 (0,1,2).

Ich habe eine Frage zur Zeile namen[namen.lenght - 1] =Eingabe.stringEinlesen();

Das wäre ja 3 - 1 wird dann auch in der ForSchleife das namen.length eins kleiner?
 
wird dann auch in der ForSchleife das namen.length eins kleiner?
Äh - das hatten wir doch in #12 schon geklärt.
Ich überlege, an welcher Stelle ich etwas ändern muss, damit der höchstmögliche Index passt.
Es gibt nur genau EINE Stelle, an der auf das Array zugegriffen wird. Was gibt es da zu überlegen?
Aktuell wird an dieser Stelle unabhängig vom Wert von "i" immer 3 - 1 gerechnet. Das muss als Hilfe reichen.
 
Äh - das hatten wir doch in #12 schon geklärt.

Ja stimmt hab es übersehen.

Ja habs fertig. namen[namen.length - 1] kam mir die ganze zeit schon sinnlos vor.
Da muss ja nur ein i hin.
Es läuft jetzt.

Musste beim Printbefehl nur i + 1 eingeben, damit er schreib
der Name des 1. und nicht des 0.

Java:
public class FehlerhafteListeStudis {

    public static void main(String[] args) {
        System.out.println("-- StudiVerwaltung --");

        System.out.println();
        System.out.print("Anzahl Studis? ");
        int anzStudis = Eingabe.intEinlesen();

        String[] namen = new String[anzStudis];

        System.out.println();
        System.out.println("* Eingabe der Namen");

        for (int i = 0; i < namen.length; i = i + 1) { //i muss bei 0 beginnen
            System.out.print("Name des " + (i + 1) + ". Studis: ");
            namen[i] = Eingabe.stringEinlesen(); //namen.length - 1 ist falsch es muss durch i ersetzt werden
            // anzStudis++; unnötige zeile
        }

        System.out.println();
        System.out.println("* Liste der Studis");
        for (int i = 0; i < anzStudis; i += 1) { //i < anzStudis nicht <)
            System.out.println(namen[i]);
        }
    }

}


Sorry für die ganzen Umstände.
 
Ja habs fertig. namen[namen.length - 1] kam mir die ganze zeit schon sinnlos vor.
Da muss ja nur ein i hin.
Bitte berücksichtige dabei, dass es sich jetzt um "Möglichkeit 4" handelt, denn das Array wird jetzt vom Anfang her befüllt. Ansonsten passt das.
Hier for (int i = 0; i < namen.length; i = i + 1) könnte anstatt i = i + 1 auch i++ stehen. Genauso bei der zweiten Schleife. Das ist aber im Prinzip egal.
 
Bitte berücksichtige dabei, dass es sich jetzt um "Möglichkeit 4" handelt, denn das Array wird jetzt vom Anfang her befüllt. Ansonsten passt das.
Hier for (int i = 0; i < namen.length; i = i + 1) könnte anstatt i = i + 1 auch i++ stehen. Genauso bei der zweiten Schleife. Das ist aber im Prinzip egal.

Ja das weiß ich stand auch vorher da aber habe es erstmal umgeschrieben. Nur als kleine Hilfe
 

Neue Themen


Zurück
Oben