ArrayIndexOutOfBoundsException

Lisa96

Neues Mitglied
Liebe Forum-Mitglieder,
Ich verstehe leider nicht wieso mir der Compiler die Fehlermeldung "Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5" gibt. Ich bin gerade dabei Java zu lernen und bin für jede Hilfe dankbar!
In der Aufgabe geht es darum, ab einer Überschreitung von einer Anzahl negativer Zahlen(b) in einer bestimmten Größe einer Reihenfolge(n) false zurückzugeben oder eben true wenn dies nicht der Fall ist.

Java:
public class Messreihe {
   
    public static void main(String[] args){
        int [] test = { 1,2,3,4,5};
        validSeries(test, 3, 2);
    }

    public static boolean validSeries (int [] a, int n, int b){
       
        int maxMistake = 0;
        int newMaxMistake = 0;
       
        for( int i= 0; i <= a.length; i++ ){
            int j = 0;
                while(i+j <= a.length || j < n){
                    if(a[i+j] < 0){
                    maxMistake++;
                    }
                    j++;
                }
            j = 0;
        }
        if(maxMistake > newMaxMistake){
            newMaxMistake = maxMistake;
        }
        maxMistake = 0;
        if(newMaxMistake >= b){
        return false;}
        else {return true;}
    }
}
 
Array indices fangen bei 0 an, d.h. sowas:
while(i+j <= a.length|| j < n){if(a[i+j]<0){

kann nicht funktionieren, da es den Index 5 nicht gibt. Es gibt nur 0,1,2,3,4.
Anders ausgedrückt: du musst deinen Index "kleiner" der Länge laufen lassen.
 
In der Aufgabe geht es darum, ab einer Überschreitung von einer Anzahl negativer Zahlen(b) in einer bestimmten Größe einer Reihenfolge(n) false zurückzugeben oder eben true wenn dies nicht der Fall ist.
Kannst du die Aufgabe nochmal genau beschreiben? Ich habe sie noch nicht ganz verstanden. Dankeschön.
 
Moin,
Also die Fehlermeldung sagt aus, dass dein Array zu "kurz" ist
na ja, streng genommen besagt sie das nicht, sondern eher, dass auf einen Index, der größer als das Array ist, zugegriffen werden soll.
Deine Aussage würde ja implizieren, das ein einfaches Vergrößern des Arrays ausreicht, was aber meist (und auch hier - siehe Beitrag von @JCODA) nicht der Fall ist, da ein Logikfehler im Algorythmus vorliegt.
Gruß Klaus
 
Kannst du die Aufgabe nochmal genau beschreiben? Ich habe sie noch nicht ganz verstanden. Dankeschön.

Wenn man für n = 3 eingibt und für b =2, dann soll das Programm false ausgeben, wenn das Array >= 2 negative Zahlen in 3 Zahlen hintereinander hat. Ich hoffe das Beispiel konnte es nochmal besser erklären 🙂

@JCODA , auch wenn ich den Array bis kleiner als die Länge laufen lasse, kommt wieder die selbe Fehlermeldung. Ich verstehe leider nicht wieso das über das Array hinausläuft, obwohl ich die Abbruchbedingung so gesetzt habe, dass es bei der Länge des Arrays stoppen soll.

An die anderen vielen Dank schonmal für die Antworten!
Habt ihr irgendwelche Lösungsvorschläge vielleicht?
 
Zuletzt bearbeitet:
Moin,
@JCODA hat doch ganz zu Anfang Deinen Fehler schion beschrieben!!
Array indices fangen bei 0 an, d.h. sowas:
while(i+j <= a.length|| j < n){if(a[i+j]<0){
kann nicht funktionieren, da es den Index 5 nicht gibt. Es gibt nur 0,1,2,3,4.
Anders ausgedrückt: du musst deinen Index "kleiner" der Länge laufen lassen.
Der erste Fehler: i ist Deine Laufvariable, die also bei Deinem Array a von 0 bis 4 laufen sollte (sie läuft halt bis 5 wegen dem '<=') !!
Dein Hauptproblem ist aber die Abfrage if(a[i+j]<0), da ja in jedem Schleifendurchlauf j inkrementiert wird!

Bau mal in die while-Schleife folgende Konsolenausgabe ein:
Java:
while( i+j <= a.length || j < n )
{
    // !!!!!
    int tmp = i+j;
    System.out.println( "i <" + i + ">  j <" + j + ">  (i+j) <" +  + tmp + ">" );       

    if( a[i+j] < 0 ) 
    {
        maxMistake++;
    }
    j++;
}
Du wirst sehr schnell erkennen, was falsch ist!

Gruß Klaus
 
@JCODA , auch wenn ich den Array bis kleiner als die Länge laufen lasse, kommt wieder die selbe Fehlermeldung. Ich verstehe leider nicht wieso das über das Array hinausläuft, obwohl ich die Abbruchbedingung so gesetzt habe, dass es bei der Länge des Arrays stoppen soll.

Das Problem ist die Abbruchbedingung in deiner while-Schleife
Dort lässt du dann vielleicht auch nur bis kleiner als die Länge laufen, ABER du hast dort eine ODER-Verknüpfung.
Sprich solange j < n zutrifft wird die while-Schleife trotzdem ausgeführt.

Dein Hauptproblem ist aber die Abfrage if(a[i+j]<0), da ja in jedem Schleifendurchlauf j inkrementiert wird!
In der while-Schleife wird das eh geprüft 😉
 

Zurück
Oben