Java: Wieso bekomme ich diesen Fehler ("ArrayIndexOutOfBoundsException: Index 9 out of bounds for length 9")?
Bei meinem Code kommt nach der Eingabe eines Wortes immer folgender Fehler.
Das ist alles von der Konsole:
Bitte geben Sie ein Wort für das B-Sprachen Spiel ein: Hallo
5
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 9 out of bounds for length 9
at B_SprachenSpiel/Lektion_7.B_SprachenSpiel.Spiel(B_SprachenSpiel.java:42)
at B_SprachenSpiel/Lektion_7.B_SprachenSpiel.main(B_SprachenSpiel.java:14)
Danach sollte eigentlich noch das Wort (in dem Fall Hallo) ausgegeben werden, nur dass es durch die Änderung dann Haballobo heißt. Das soll das Programm machen. Doch ich verstehe nicht, wieso immer wieder dieser Fehler kommt.
Folgendes ist mein kompletter Code von diesem Programm:
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);
// System.out.println("Das umgewandelte Wort lautet: " + Spiel(B));
}
public static void Spiel(String Wort) {
char[] x = new char [100];
x = Wort.toCharArray();
System.out.println(x.length);
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;
}
}
System.out.println(lang);
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]);
}
}
String z = x.toString();
System.out.println(" Das umgewandelte Wort lautet: " + String.valueOf(neu));
// for (int i = 0; i <= x.length; i++)
// {
// System.out.print(x[i]);
// }
}
}
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.
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.
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
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
Damit ich das richtig verstehe: Du willst nach jedem Vokal ein b hinmachen?
Ja und am ende dann das "verbesserte" wort ausgeben also das mit dem b nach jedem vokal
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").
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
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.
Das hat schon mal funktioniert nur jetzt gibt er mir irgendwie gar kein Wort mehr auf der Konsole aus am ende