如何在我的铁栅栏密码程序中调试“ArrayIndexOutOfBoundsException”?

时间:2014-03-24 15:53:45

标签: java encryption

这是使用铁栅栏密码进行加密和解密的整个程序。我在最后一行但第四行得到ArrayIndexOutOfBoundsException。请帮助我理解并修复此错误。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Pratheesh
 */
public class Test {

public void encrypt2(String line,int rail)
{
    int shift=0,p=0,itr;
    for(int i=0;i<rail;i++)
    {
        p=i;
        if(i==0||i==rail-1)
        shift=((rail-2)*2)+2;
        itr=1;
        while(p<line.length())
        {
            System.out.print(line.charAt(p));
            if(i!=0&&i!=rail-1)
            {
                shift=((rail*itr-itr)-p)*2;
            }
            p+=shift;
            itr++;
        }
    }
}

public void decrypt2(String line,int arr[])
{
    int ptr[]=new int[arr.length+1];
    int p1=0,p2=0,p3=0,c=1;
    boolean chk=true;
    System.out.print(line.charAt(ptr[p3]+p1));
    ptr[p3]++;
    while(c<line.length())
    {
        if(chk)
        {
            p1+=arr[p2];
            p2++;
            p3++;
        }
        else
        {
            p1-=arr[p2];
            p2--;
            p3--;
        }
        System.out.print(line.charAt(ptr[p3]+p1));
        c++;
        ptr[p3]++;
        if(p2==arr.length)
        {
            p2--;
            chk=false;
        }
        else if(p2==-1)
        {
            p2++;
            chk=true;
        }
    }

}

public static void main(String args[]) throws IOException, ArrayIndexOutOfBoundsException{

    Test obj=new Test();
    String line;
    int rail,arr[],temp;
    line="Password";
    rail=Integer.valueOf(2);
    temp=line.length()-rail;
    int spaces;
    if(temp%(rail-1)!=0)
    {
        spaces=(rail-1)-(temp%(rail-1));
        if((temp/(rail-1))%2!=0)
        {
            spaces+=rail-1;
        }
    }
    else
    {
        spaces=temp%(rail-1);
        if((temp/(rail-1))%2==0)
        {
            spaces+=rail-1;
        }
    }
    for(int g=0;g<spaces;g++)
        line+=' ';
    obj.encrypt2(line,rail);
    //Decryption
    temp=line.length()-rail;
    arr=new int[rail-1];
    if((temp/(rail-1))%2==0)
        arr[0]=1+(temp/(rail-1))/2;
    else
        arr[0]=1+((temp/(rail-1))+1)/2;
    arr[1]=arr[0]*2-2;
    for(int i=2;i<rail-1;i++)
        arr[i]=arr[1]
    obj.decrypt2(line,arr);
}
}    

1 个答案:

答案 0 :(得分:2)

分配新数组时,方括号中的数字是数组中元素的数量,不是数组最后一个元素的索引。因此,如果您想要一个包含两个元素arr[0]arr[1]的数组,则需要说

arr = new int[2];  // or some expression whose value is 2

arr = new int[1];  // there will be only one element, arr[0]

我怀疑错误是因为您尝试分配给arr[1],但数组只有一个元素。