Caesar-Verschiebung: IndexOutOfBoundsException bei Verschiebung > array.length

moshpit

Mitglied
Hallo liebe Community,

ich habe ein Problem, das ich nicht zum Lösen im Stande bin. Programmiert werden soll die Caesar-Verschiebung (ohne ASCII Tabelle). Leider bekomme ich bei der Eingabe einer Verschiebung um n Stellen (wobei gilt: n > Arraylänge) eine IndexOutOfBoundsException in der Encodingmethode.

Hier der entsprechende Code:

Java:
	//
	// Encode Methode
	//
	public String encode(String text) {
		StringBuilder sb = new StringBuilder();							// Für den Aufbau des codierten Strings
		String newText = text.toString();								// Eliminiert Leerzeichen/nicht gesetzte Zeichen
		char letter[] = newText.toLowerCase().toCharArray();							// Wandelt Eingabe in Kleinbuchstaben und legt neues Array fest
		int current = 0;												// Index aktueller Buchstabe

		System.out.println();
		System.out.println("Bitte Verschiebung um n Stellen angeben \n(nur positive Zahlen): ");
		Scanner eingabe = new Scanner(System.in);
		int n = eingabe.nextInt();
		System.out.println();
		System.out.println("Encoding läuft mit n = " + n + "...");
		System.out.println();
		eingabe.close();

		// Füllt den StringBuilder mit den Zeichen aus der Eingabe
		for (int k = 0; k < letter.length; k++) {
			if (letter[current] == ' ') {
				sb.append(' ');
			}
			for (int i = 0; i < alphabet.length; i++) { 				// Prüft das Alphabet
				
				if (letter[current] == alphabet[i]) { 				// Prüft ob aktuelles Zeichen = Zeichen im Alphabet an Stelle i
					if ((i + n) >= alphabet.length)
						sb.append(alphabet[(int) Math.abs(((alphabet.length) - i)- n)]); 		// Verschiebung
					else
						sb.append(alphabet[i + n]); 					// Verschiebung
				}
				if (i == alphabet.length - 1) 							// beim letzten Buchstaben des Alphabets tue ...
					current++;											// Nächsten Buchstaben im String prüfen														
			}
		}return sb.toString();											// gebildeten String ausgeben
	}


Beispiel:
beim Schlüssel n=35 gibt die Konsole folgendes aus

"Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 32
at CaesarCrypt.encode(CaesarCrypt.java:44) <-//[entspricht Zeile 28 hier im Code]
at CaesarCrypt.main(CaesarCrypt.java:145)"


Über fachmännischen Rat wäre ich sehr dankbar!


MfG
 
Zuletzt bearbeitet:
Moin

Code:
if (letter[current] == alphabet[i]) {               // Prüft ob aktuelles Zeichen = Zeichen im Alphabet an Stelle i
                    if ((i + n) >= alphabet.length)
                        sb.append(alphabet[(int) Math.abs(((alphabet.length) - i)- n)]);        // Verschiebung
                    else
                        sb.append(alphabet[i + n]);                     // Verschiebung
                }

Du greifst auf ein array-Element zu, das nicht existiert. Die Berechnung für den Zugriff auf das alphabet-Array scheint nicht korrekt zu sein.

Ich denke du könntest dir die Sache mit einer Modulo berechnung einfacher machen

Sowas wie alphabet[n % alphabet.length]

Grüße
 

moshpit

Mitglied
Habe jetzt die Lösung:

Java:
	if (letter[current] == alphabet[i]) { 				
		if ((i + n) >= alphabet.length){
			sb.append(alphabet[Math.abs((alphabet.length-i)-n)%alphabet.length]); 	
		}else{
			sb.append(alphabet[i + n]); 
		}


Funktioniert soweit. Danke!
 

Neue Themen


Oben