我有以下代码,但一直收到错误,但文件构建正常,我是相当新的。
就像我说文件构建正常,它接受输入1& 2并给出了选项,但不断给我一个例外。它将询问关键字和明文,但是当它解密或包含时,会出现以下错误。
很抱歉我第一次尝试了这个问题..希望这有点好......
线程“main”中的异常java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:3 at java.lang.String.charAt(String.java:695)at playfair.format(playfair.java:123)at playfair.Divid2Pairs(playfair.java:135)at playfair.Encript(playfair.java:187)at playfair.main(playfair.java:332)
import java.util.Scanner;
public class playfair {
private String KeyWord=new String();
private String Key=new String();
private char matrix_arr[][]= new char[5][5];
public void setKey(String k){
// This function will take the input key from the user
// Then it'll remove duplication of letters from the key
// Will add it to the private KeyWord for matrix generation
String K_adjust=new String();
boolean flag = false;
K_adjust = K_adjust + k.charAt(0);
for(int i=1; i<k.length();i++){
for(int j=0;j<K_adjust.length(); j++){
if(k.charAt(i)==K_adjust.charAt(j))
{
flag = true;
}
}
if(flag == false){
K_adjust = K_adjust + k.charAt(i);
}
flag = false;
}
KeyWord=K_adjust;
}
public void KeyGen()
{
// This function adjust the alphabetical letters adding the
// KeyWord on the beginning of them & then it calls the matrix function
boolean flag=true;
char current;
Key=KeyWord;
for ( int i=0 ; i<26 ; i++){
current=(char)(i+97);
if(current=='j')
continue;
for(int j=0 ; j< KeyWord.length() ; j++ ){
if (current == KeyWord.charAt(j)){
flag=false;
break;
}
}
if(flag)
Key=Key+current;
flag=true;
}
System.out.println(Key);
matrix ();
}
private void matrix ()
{
int counter=0;
for (int i=0 ; i<5 ;i++){
for (int j=0 ; j<5 ; j++){
matrix_arr[i][j]=Key.charAt(counter);
System.out.printf("%s ",matrix_arr[i][j]);
counter++;
}
System.out.println("\n");
}
}
private String format(String old_text)
{
// This function is to adjust the Text to encrypt
// It changes all the 'j' letters to 'i' & add 'x' character
// between repeatable pairs.
int i = 0;
int j = 0;
int len = 0;
String text = new String();
len = old_text.length();
//System.out.println(old_text);
/*** Change all j's into i's *****/
for (int tmp = 0; tmp < len; tmp++)
{
if (old_text.charAt(tmp) == 'j')
{
text = text + 'i';
}
else
text = text+old_text.charAt(tmp);
}
/**********************************/
len = text.length();
/*** Assign 'x' to letters that repeat in a diagram ***/
for (i = 0; i < len; i = i + 2){ //run for half of string length
if (text.charAt(i+1) == text.charAt(i)){ //if char = previous char
text = text.substring(0, i+1) + 'x' + text.substring(i+1);
}else{ //not a repeat character, move along
}
}
return text;
}
private String [] Divid2Pairs (String new_string)
{
String Original = format(new_string);
int size= Original.length();
if(size%2!=0){
size++;
Original = Original+'x';
}
String x[]= new String[size/2];
int counter=0;
for ( int i=0 ; i<size/2 ;i++){
x[i]=Original.substring(counter, counter+2);
System.out.println(x[i]);
counter=counter+2;
}
return x;
}
public int[] GetDiminsions(char letter){
int []key=new int[2];
if ( letter == 'j')
letter='i';
for (int i=0 ; i<5 ;i++)
{
for (int j=0 ; j<5 ; j++){
if(matrix_arr[i][j] == letter){
key[0]=i;
key[1]=j;
break;
}
}
}
return key;
}
public String Encript(String Source)
{
System.out.println("Encription Start");
String src_arr[]=Divid2Pairs(Source);
String Code=new String();
char one;
char two;
int part1[]=new int[2];
int part2[]=new int[2];
//start on pair by pair
for (int i=0 ; i< src_arr.length ;i++ ){
one = src_arr[i].charAt(0);//get first char
two = src_arr[i].charAt(1);//get second char
part1 = GetDiminsions(one);//get position of the first char
part2 = GetDiminsions(two);//get position of the second char
//check for special cases
if(part1[0]==part2[0]){//same row
if (part1[1]<4)
part1[1]++;
else
part1[1]=0;
if(part2[1]<4)
part2[1]++;
else
part2[1]=0;
}
else if (part1[1]==part2[1]) //same column
{
if (part1[0]<4)
part1[0]++;
else
part1[0]=0;
if(part2[0]<4)
part2[0]++;
else
part2[0]=0;
}
else
{
int temp=part1[1];
part1[1]=part2[1];
part2[1]=temp;
}
Code= Code + matrix_arr[part1[0]][part1[1]] + matrix_arr[part2[0]][part2[1]];
}
System.out.println(Code);
return Code;
}
public String Decript (String Code){
System.out.println("Decription Start");
String Original=new String();
String src_arr[]=Divid2Pairs(Code);
char one;
char two;
int part1[]=new int[2];
int part2[]=new int[2];
//start on pair by pair
for (int i=0 ; i< src_arr.length ;i++ ){
one = src_arr[i].charAt(0);//get first char
two = src_arr[i].charAt(1);//get second char
part1 = GetDiminsions(one);//get position of the first char
part2 = GetDiminsions(two);//get position of the second char
//check for special cases
if(part1[0]==part2[0]){//same row
if (part1[1]>0)
part1[1]--;
else
part1[1]=4;
if(part2[1]>0)
part2[1]--;
else
part2[1]=4;
}
else if (part1[1]==part2[1]) //same column
{
if (part1[0]>0)
part1[0]--;
else
part1[0]=4;
if(part2[0]>0)
part2[0]--;
else
part2[0]=4;
}
else
{
int temp=part1[1];
part1[1]=part2[1];
part2[1]=temp;
}
Original =Original + matrix_arr[part1[0]][part1[1]] + matrix_arr[part2[0]][part2[1]];
}
System.out.println(Original);
return Original;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
playfair x=new playfair();
Scanner sc = new Scanner(System.in);
System.out.println("Enter a lower case keyword:");
String keyword = sc.next();
x.setKey(keyword);
x.KeyGen();
System.out.println("To Encrypt enter 1 \nTo Decript enter 2\nTesting both enter anything else:");
int choosen_value = sc.nextInt();
if(choosen_value==1)
{
System.out.println("Enter a lower case word to encrypt:");
String key_input = sc.next();
String Encripted= x.Encript(key_input);
}else if(choosen_value==2){
System.out.println("Enter a lower case word to decrypt:");
String decripted = sc.next();
x.Decript(decripted);
}else{
System.out.println("Enter a lower case word to encrypt & decrypt:");
String key_input = sc.next();
String Encripted= x.Encript(key_input);
x.Decript(Encripted);
}
}
}
再次非常感谢
答案 0 :(得分:1)
(i = 0; i < len; i = i + 2)
导致异常
您可能需要在此处i<len-1
。
答案 1 :(得分:1)
在format
方法中,在以下循环中
for (i = 0; i < len; i = i + 2)
text.charAt(i+1)
是导致问题的一行。
您需要遍历len-1
而不是len
。
这是因为当i
完全1
而不是len
时,它仍会执行for
循环,但i+1
位于charAt()
}}方法将尝试获取索引char
上的len(since i+1 is now equal to len)
,这会引发StringIndexOutOfBoundsException
,因为字符串中的最大可访问索引为str.length()-1
。