Java-Programm funktionier unerklärlicherweise nicht?
Mein Java Programm soll in der Zukunft eine Enigmamaschine simulieren. Ich möcht e das man sie auch beliebig einstellen kann, aber wenn ich es ausprobiere kommt nur ein Error. Dieser entsteht in den Zeilen 25-36, aber nach mehrfacjiger Prüfung verstehe ich immer noch nicht warum.
Hier ist der Code:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int counter1 = 0;
String input;
String settings;
String spellzs;
System.out.println("Dieses Programm chiffriert deinen Text mit der Enigma-M4-Verschlüsslung.");
System.out.println("Gib deinen Text zum Verschlüsslen ein.(ohne Leerzeichen)");
input = scan.nextLine();
System.out.println("Gib die Verschlüsslungseinstellungen an.");
System.out.println("z.B.: AZ-BY-CX-DW-EV-FU-GT-HS-IR-JQ-I-VI-VIII->1->13->26-A-M-Z");
settings = scan.nextLine();
String[] spelledInput = new String[input.length()];
for (int i = 0; i < input.length(); i++) {
spelledInput[i] = "";
spelledInput[i] += input.charAt(i);
}
String[] spelledSettings = new String[19];
for (int i = 0; i < 19; i++) {
spelledSettings[i] = "";
}
for (int i = 0; i < 19; i++) {
spellzs = "";
spellzs += settings.charAt(counter1);
if (!spellzs.equals("-")) {
spelledSettings[i] += settings.charAt(counter1);
counter1++;
i--;
}
else {
counter1++;
}
}
for (int i = 0; i < spelledSettings.length; i++) {
System.out.println(spelledSettings[i]);
}
}
}
Ich hoffe auf baldige Antwort und danke im voraus.
Der Error lautet:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: Index 56 out of bounds for length 56
at java.base/jdk.internal.util.Preconditions$1.apply(Preconditions.java:55)
at java.base/jdk.internal.util.Preconditions$1.apply(Preconditions.java:52)
at java.base/jdk.internal.util.Preconditions$4.apply(Preconditions.java:213)
at java.base/jdk.internal.util.Preconditions$4.apply(Preconditions.java:210)
at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:98)
at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:106)
at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:302)
at java.base/java.lang.String.checkIndex(String.java:4881)
at java.base/java.lang.StringLatin1.charAt(StringLatin1.java:46)
at java.base/java.lang.String.charAt(String.java:1582)
at Main.main(Main.java:27)
Was letzte Fehlermeldung?
Sie ist zu lang für eine Antwort ich bearbeite meine Frage so das sie die Fehlermeldung enthält
2 Antworten
Dacht ich mir schon, als ich den Code grob überflogen hab, aber mit der Fehlermeldung ist's bestätigt:
In der Zeile
spellzs += settings.charAt(counter1);
bzw. in deren Vorfeld überprüfst du nicht, ob counter1 evtl. über den letzten Index von settings hinausgeht.
Bedeutet, dass du versuchst auf ein Element hinter dem Ende des Strings zuzugreifen, was natürlich nicht funktioniert.
Ich glaube es liegt daran, dass du den Wert 56 ändern musst. (0 muss beachtet werden)
Verbesserung:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
// Variablendeklaration
int counter1 = 0;
String input;
String settings;
String[] spelledInput = new String[input.length()];
String[] spelledSettings = new String[19];
String[] rotors = new String[3];
int[] rotorPositions = new int[3];
// Programm Beschreibung
System.out.println("Dieses Programm chiffriert deinen Text mit der Enigma-M4-Verschlüsslung.");
// Benutzereingabeaufforderung
System.out.println("Gib deinen Text zum Verschlüsseln ein (ohne Leerzeichen):");
input = scan.nextLine();
System.out.println("Gib die Verschlüsselungseinstellungen an (z.B.: AZ-BY-CX-DW-EV-FU-GT-HS-IR-JQ-I-VI-VIII->1->13->26-A-M-Z):");
settings = scan.nextLine();
// Eingabeverarbeitung
for (int i = 0; i < input.length(); i++) {
spelledInput[i] = "";
spelledInput[i] += input.charAt(i);
}
for (int i = 0; i < 19; i++) {
spelledSettings[i] = "";
}
for (int i = 0; i < 19; i++) {
String spellzs = "";
spellzs += settings.charAt(counter1);
if (!spellzs.equals("-")) {
spelledSettings[i] += settings.charAt(counter1);
counter1++;
i--;
} else {
counter1++;
}
}
// Einstellungen parsen
parseSettings(settings, rotors, rotorPositions);
// Verschlüsselung
for (int i = 0; i < spelledInput.length; i++) {
int currentRotor = 0;
int currentRotorPosition = rotorPositions[currentRotor];
char encryptedChar = spelledInput[i].charAt(0);
while (currentRotor < 3) {
encryptedChar = rotors[currentRotor].charAt((encryptedChar - 'A' + currentRotorPosition) % 26);
currentRotorPosition = (currentRotorPosition + 1) % 26;
currentRotor++;
}
spelledInput[i] = "" + encryptedChar;
}
// Ausgabe
for (int i = 0; i < spelledInput.length; i++) {
System.out.print(spelledInput[i]);
}
System.out.println();
}
private static void parseSettings(String settings, String[] rotors, int[] rotorPositions) {
// Implementieren Sie die Logik zum Parsen der Einstellungen
// ...
}
}