Compiler-Fehler java.lang.StringIndexOutOfBoundsException

  • Themenstarter Themenstarter Javafragen
  • Beginndatum Beginndatum
J

Javafragen

Gast
Ausgeworfen wird:

Exception in thread "AWT-EventQueue-0" java.lang.StringIndexOutOfBoundsException: String index out of range: -1

Code:

Java:
	public String dekodiere(String geheimtext) {

		String decoded = "";
		//Ermitteln der Positionen:

		int [] key1Pos = new int[codeword.length()];
			for(int i = 0; i < key1Pos.length; i++)
			{
				//ermitteln der Anzahl des bisherigen Auftretens des Buchstabens
				char currentLetter = geheimtext.charAt(i);
				int included = 0;
				for(int j = 0; j < i; j++)
				{
					if(geheimtext.charAt(j) == currentLetter)
					{
						included++;
					}

				}
				//Ermitteln der Position:
				for(int k = 0; k < key1Pos.length; k++)
				{
					if(codeword.charAt(k) == currentLetter)
					{
						key1Pos[i] = k + 1;
						if(included == 0)
						{
							break;
						}
						else
						{
							included--;
						}
					}
				}
			}
			//Erzeugen einer Matrix:
			Matrix [] matrixArray = new Matrix[geheimtext.length()];

			for(int i = 0; i < geheimtext.length(); i++){
				int keyIndex = key1Pos[(i % key1Pos.length)];
				int blockIndex = i / key1Pos.length;
				matrixArray[i] = new Matrix(keyIndex, geheimtext.charAt(i), blockIndex, key1Pos.length);
			}
			
			//Weitergabe der Matrix:
			for(int i = 1; i <= geheimtext.length(); i++){
				for(int j = 0; j < geheimtext.length(); j++){
					if(matrixArray[j].getPosition() == i){
						decoded += matrixArray[j].getValue();
						break;
					}
				}
			}

			return decoded;
	}
 
Ich war durchaus versucht zu schreiben: "Interessant."

Aber meine Kristallkugel hat mir erklärt, dass du vermutlich etwas anderes willst:

Code:
StringIndexOutOfBoundsException: String index out of range: -1
--> Man betrachte: String index out of range: -1
=> -1 ist kein gültiger Index im String

Wenn du dir den vollständigen Stacktrace anschaust dann wird dort sicher auch genau die Zeile benannt, in der der Fehler auftritt (vermutlich die oberste oder zweitoberste).
 
Exception in thread "main" java.lang.NullPointerException
at bla.main(Fehler.java:25)


Java:
public static void main(String[] args){
		
		String bla = null;
		bla.length();
}


geht doch hier darum seinen Lieblingsfehler vorzustellen oder?


edit: och menö Kroko macht alles kaputt
 
char currentLetter = geheimtext.charAt(i);

Hier soll er angeblich auftreten
Ich versteh aber nicht wieso das ist mein problem.
 
weil dein
Code:
i
wahrscheinlich weiter zählt als dein
Code:
geheimtext
lang ist da du dort durch die Länge eines anderen arrays gehst.
da verwendest du
Code:
codeword.length()
und nicht
Code:
geheimtext.length()
 
java.lang.StringIndexOutOfBoundsException: String index out of range: 2

wirft er aus, wenn ich das austausche...
 
Wahrscheinlich ist dein
Code:
codeword
wo auch immer das her kommt, sollte wahrscheinlich dein
Code:
geheimtext
sein, nicht so lang ist, da du nicht durch das wort gehst, sondern durch ein anderes Array, nämlich mit der länge von
Code:
geheimtext
wenn du es oben angepasst hast.
Wo kommt eigendlich dein
Code:
codeword
her?
 
Nein das Codeword und Geheimtext sind nicht das selbe.

Das Codeword ist für die Entschlüsselung des Geheimtextes gedacht, das ganze ist die sogenannte Doppelte Spaltentransposition(Doppelwürfel) und ich hab beim verschlüsseln kein Problem

daher kommt das Codeword:

Java:
 */
	public void setzeLosung(String schlüssel) throws IllegalArgumentException {
		try {
			if (schlüssel.length()>26 || schlüssel.length()==0){
				throw new IllegalArgumentException("e");
			}
		} catch (Exception e) {
			JOptionPane.showMessageDialog(null,"Fehler: Codeword zu lang oder 0", "Fehler", JOptionPane.ERROR_MESSAGE);

		}
		this.codeword=schlüssel;
		
}

Hier erfolgt der Aufruf von decode():
Java:
if (e.getSource()==decode) {
			klartextlabel.setText("Entschlüsselter Text");
			würfel1.setzeLosung(codewort2.getText());
			String encode1=würfel1.dekodiere(geheimtext.getText());
			würfel2.setzeLosung(codewort1.getText());
			String encode2 = würfel2.dekodiere(encode1);
			klartext.setText(encode2);
		}
 
wie gesagt, auch da tust du in der Schleife, ein anderes Array als Grenze zu nehmen und das muss nunmal nicht die länge des Arrays haben, das du testest.

Du erhöst zum Beispiel dein k 10 mal, da
Code:
key1Pos
10 elemente hat, aber dein
Code:
codeword
hat nur 8 Einträge dann bist du mit
Code:
codeword.charAt(k)
nunmal außerhalb der Grenze deines Arrays, was dann eine
Code:
IndexOutOfBoundsException
wirft.
 
Und wie soll ich dann das ganze sonnst verteilen?

Es muss der Geheimtext über die Länge vom Codewort verteilt werden
 

Neue Themen


Zurück
Oben