Java hilfe für index outs of

Fabse93

Lt. Junior Grade
Registriert
Dez. 2008
Beiträge
277
hallo, ich hab hier ein programm das ROT13 ver/entschlüsseln soll, bekomme jedoch immmer die fehlermeldeung

Exception in thread "AWT-EventQueue-1" java.lang.StringIndexOutOfBoundsException: String index out of range: 49
at java.lang.String.charAt(Unknown Source)
at ROT13.jButton1ActionPerformed(ROT13.java:120)
at ROT13.access$0(ROT13.java:110)
at ROT13$2.actionPerformed(ROT13.java:100)

hier ist das programm:

Code:
String text1=jTextArea1.getText();
		String text2="";
		String text3="";
		String text4;
		char zeichen;
		for (int i=0; i<=text1.length(); i++){
			zeichen=text1.charAt(i);
			text4=String.valueOf(zeichen);
			
			text2=text4.replace('a', 'N');
			text2=text4.replace('b', 'O');
			text2=text4.replace('c', 'P');
			text2=text4.replace('d', 'Q');
			text2=text4.replace('e', 'R');
			text2=text4.replace('f', 'S');
			text2=text4.replace('g', 'T');
			text2=text4.replace('h', 'U');
			text2=text4.replace('i', 'V');
			text2=text4.replace('j', 'W');
			text2=text4.replace('k', 'X');
			text2=text4.replace('l', 'Y');
			text2=text4.replace('m', 'Z');
			text2=text4.replace('n', 'A');
			text2=text4.replace('o', 'B');
			text2=text4.replace('p', 'C');
			text2=text4.replace('q', 'D');
			text2=text4.replace('r', 'E');
			text2=text4.replace('s', 'F');
			text2=text4.replace('t', 'G');
			text2=text4.replace('u', 'H');
			text2=text4.replace('v', 'I');
			text2=text4.replace('w', 'J');
			text2=text4.replace('x', 'K');
			text2=text4.replace('y', 'L');
			text2=text4.replace('z', 'M');
			text2=text2.toLowerCase();
			text3=text3+text2;
			}//for
		jTextArea1.setText(text3);
	}
 
Zuletzt bearbeitet von einem Moderator: (CODE Tags ergänzt; Bitte zukünftig selbst machen!)
Du solltest auf jeden Fall dir Schleife nur bis i<text1.length() laufen lassen. Ansonsten versuchst du (bei einem leeren Textfeld) das erste Zeichen eines leeren Strings zu holen, was in genannter Exception resultiert.
 
danke, der fehler in der exception ist nun beseitigt
 
Abgesehen davon: Wenn du eh schon ein Char hast, dann mach doch einfach ein switch/case und dann text2="N"; usw. Oder noch besser: Addiere bzw. subtrahiere einfach 13 zum Char dazu. Wie das geht sieht man hier: http://www.cs.princeton.edu/introcs/31datatype/Rot13.java.html Dann gehen nämlich auch Groß-und Kleinbuchstaben!
Wenn du große Textmengen verschlüsseln willst könnte man die Performance zudem verbessern indem du am Anfang mit text1.toCharArray() das Char-Array holst und den neuen Text mit einem StringBuilder zusammenbaust.
So in etwa:
PHP:
StringBuilder sb = new StringBuilder();
char[] text=jTextArea1.getText().toCharArray();
for (int i = 0; i < text.length; i++) {
   char c = text[i];
   if (c >= 'a' && c <= 'm') sb.append(c + 13);
   else if  (c >= 'n' && c <= 'z') sb.append(c - 13);
   else if  (c >= 'A' && c <= 'M') sb.append(c + 13);
   else if  (c >= 'A' && c <= 'Z') sb.append(c - 13);
   else sb.append(c);      // Sonderzeichen, Leerzeichen
}
jTextArea1.setText(sb.toString());
 
Zuletzt bearbeitet:
Bei jedem Replace geht er übrigens einmal komplett durch den ganzen String durch.
 
ich muss das leider mit java und replace machen, für schule
 
@Cyba_Mephisto:
Der "ganze String" besteht hier aber nur aus einem Zeichen ;) Trotzdem ist der Aufwand vergleichsweise hoch.

@Fahi:
Die replace-Funktion macht hier eigentlich wirklich keinen Sinn; gibt das der Lehrer wirklich vor? Denn das ist alles andere als gute Programmierpraxis. Außerdem funktioniert dein Code wie gesagt nicht für Großbuchstaben.
 
ich habs anders gemacht, nur die Polybius-Leute sollten mit replace

mein neuer programmtext:

String text1=jTextArea1.getText();
text1=text1.toLowerCase();
String text2="";
String alphabet="abcdefghijklmnopqrstuvwxyz";
int p;
int text3;

for (int i=0; i<text1.length(); i++){
char zeichen=text1.charAt(i);
p=alphabet.indexOf(zeichen);

if(p==-1){
text2=text2+" ";
}

else{
text3=(p+13)%26;
char neu=alphabet.charAt(text3);
text2=text2+neu;
}

}//for
jTextArea1.setText(text2);
 
Polybius-Leute? Hab ich was überlesen? Wer soll das sein?

Der neue Code ist trotzdem wesentlich ineffizienter, da du völlig unnötigerweise für jedes Zeichen den ganzen alphabet-String nach ihm mit indexof durchsuchst.
 
ich muste es ja mit sachen lösen die ich breits kenne
 
Sorry, hab´ ich nicht gesehen, peinlich. -.-
Ich wusste ehrlich gesagt nicht wirklich wie Rot13 funktionieren sollte, deswegen hab´ ich das irgendwie nicht verstanden (nebenbei noch telefoniert). Jetzt ist wieder alles klar. :) Ich wusste garnicht, dass man Chars so einfach vergleichen kann mit den Operatoren.
 
Zuletzt bearbeitet:

Ähnliche Themen

Zurück
Oben