Java: Wieso bekomme ich diesen Fehler ("ArrayIndexOutOfBoundsException: Index 9 out of bounds for length 9")?

3 Antworten

Das Problem mit dem Array-Index wurde ja schon erklärt. Das nächste Problem lauert zwei Zeilen weiter unten:

neu[i] = (char) (x[i] + 'b' + (char) x[i]);

Du versuchst, drei Zeichen in ein char zu quetschen. Das geht nicht. Mich wundert es ehrlichgesagt, dass Java hier keinen Fehler ausspuckt. Vermutlich versucht Java einfach das Beste draus zu machen und ersetzt jedes Zeichen durch einen Null-Char. Du müsstest also "neu" am besten einfach als String anlegen, dann jedes Zeichen im alten String durchgehen und jeden Fund an "neu" anhängen.

public static String bword(String wort) {
	String neu = "";
	for (char c:wort.toCharArray()) {
		if (Arrays.asList('a', 'e', 'i', 'o', 'u').contains(c)) {
			neu += c+"b"+c;
		} else {
			neu += c;
		}
	}
	return neu;
}

Wenn du es noch einfacher haben willst, kannst du auch einfach mit regex die Vokale ersetzen:

public static void main(String[] args) {
	Scanner sc = new Scanner(System.in);
	System.out.print("Bitte geben Sie ein Wort für das B-Sprachen Spiel ein: ");
	String word = sc.nextLine();
	sc.close();
	System.out.println("Das umgewandelte Wort lautet: " + word.replaceAll("([aeiou])", "$1b$1"));
}

Der Fehler passiert in Zeile 42 und ich werde jetzt nicht so weit zählen, aber ziemlich sicher bezieht es sich auf "if (x[i] == 'a'".

Das array hat 9 stellen, allerdings fängt man beim Programmieren bei 0 an, wenn man zählt, also ist die erste stelle x[0] und die letzte stelle x[8]. Das array hat aber eine Länge von 9, also versuchst du auf x[9] zuzugreifen, was es nicht gibt. Deshalb musst du in der Schleife entweder i<neu.length oder i<=neu.length-1 schreiben.

Woher ich das weiß:Studium / Ausbildung – Informatik Student

Javaanfaenger48 
Beitragsersteller
 10.11.2021, 13:28

Danke das funktioniert jetzt auch nur habe ich nun das Problem das es mir am Ende gar kein Wort mehr ausgibt

Du solltest die zweite for-Schleife

for (int i = 0; i <= neu.length; i++)

durch

for (int i = 0; i < neu.length; i++)

ersetzen. Du prüfst dort, ob i kleiner oder gleich wie die Länge des Arrays ist. Beachte aber, dass man bei Listen immer bei 0 beginnt zu zählen. Bei einem Array mit der Länge 7 wäre also der maximale Index eine 6.

Also musst du nicht mit <= sondern < testen.

Woher ich das weiß:Berufserfahrung – Informatiker Applikationsentwicklung

Javaanfaenger48 
Beitragsersteller
 10.11.2021, 13:26

Das hat schon mal funktioniert nur jetzt gibt er mir irgendwie gar kein Wort mehr auf der Konsole aus am ende

TechPech1984  10.11.2021, 13:29
@Javaanfaenger48

das ist aber falsch array fangen bei 0 an und nicht bei 1

ergo ein aray mit 9 elmenten startet bei 0 und geht bis 8

Javaanfaenger48 
Beitragsersteller
 10.11.2021, 13:30
@TechPech1984

Das Problem mit dem Array habe ich ja gelöst es kommt auch keine Fehlermeldung mehr es kommt am ende wo das neue wort stehen soll einfach gar keine Ausgabe mehr

Javaanfaenger48 
Beitragsersteller
 10.11.2021, 13:41
@Lezurex

Ja und am ende dann das "verbesserte" wort ausgeben also das mit dem b nach jedem vokal

Lezurex  10.11.2021, 13:48
@Javaanfaenger48

Okay, verstehe.

char[] neu = new char[lang];
		
for (int i = 0; i <= neu.length; i++)
{
	if (neu[i] == 'a' || neu[i] == 'e' || neu[i] == 'i' || neu[i] == 'o' || neu[i] == 'u' )
	{		
		neu[i] = (char) (x[i] + 'b' + (char) x[i]);
	}
}

Hier erstellst du oben einen neuen Char-Array neu. Dieser hat keinen Inhalt. Im for-Loop prüfst du dann, ob ein Buchstabe aus dem eben erstellten Array ohne Inhalt ein a, e, i, o oder u ist. Logischerweise wird dies aber nie der Fall sein, da der Array ja eben leer ist. Du musst das also irgendwie mit deinem alten Array überprüfen.

Die Lösung sage ich dir hier jetzt nicht, da kannst du selbst nochmals ein wenig weitertüfteln :)

Übrigens: Strings solltest du nicht mit == überprüfen, sondern mit meinString.equals("ein anderer String").

Javaanfaenger48 
Beitragsersteller
 10.11.2021, 14:05
@Lezurex

Ich hab nur noch ein einziges Problem und überhaupt kein Plan wie ich es lösen soll denn die Ausgabe am ende vom Programm die eigentlich Haballobo sein sollte ist H?ll?.

Also keine Vokale mehr sondern einfach nur noch Fragezeichen

Javaanfaenger48 
Beitragsersteller
 10.11.2021, 14:39
@Lezurex

package Lektion_7;

import java.lang.reflect.Array;

import java.util.Scanner;

public class B_SprachenSpiel {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

System.out.print("Bitte geben Sie ein Wort für das B-Sprachen Spiel ein: ");

String B = sc.nextLine();

Spiel(B);

}

public static void Spiel (String Wort)

{

char[] x = new char [100];

x = Wort.toCharArray();

int y = x.length;

int lang = x.length;

for (int i = 0; i < y; i++)

{

if (x[i] == 'a' || x[i] == 'e' || x[i] == 'i' || x[i] == 'o' || x[i] == 'u' )

{

lang += 2;

}

char[] neu = new char[lang];

neu = x;

for (int i = 0; i < neu.length; i++)

{

if (neu[i] == 'a' || neu[i] == 'e' || neu[i] == 'i' || neu[i] == 'o' || neu[i] == 'u' )

{

neu[i] = (char) (x[i] + 'b' + x[i]);

}

}

String z = String.valueOf(neu);

System.out.println("             Das umgewandelte Wort lautet: " + String.valueOf(z));

}

}

Das ist der ganze Code.