为什么编译器会给出“java.lang.ArrayIndexOutOfBoundsException:x -error?(size取决于输入)

时间:2014-09-18 13:24:41

标签: java encryption arraylist standard-deviation vigenere

我正在制作一个小程序来猜测vigenere-cipher的密钥长度,在java中给定长度在5-15之间。 我这样做是因为换位而计算标准偏差。 但我真正的问题是为什么我在方法“countFrequency”中得到数组中的出界错误。我似乎无法看到它超出界限。

我知道我的程序可能更有效率,但我认为一旦修复此错误就应该可行。 我的程序代码如下。

谢谢!

import java.awt.List;
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class main {

// Scanning the encrypted text

// private static char encryptedText[];

public static void main(String[] args) throws IOException{
Scanner scan = null;new Scanner(System.in);
scan = new Scanner(System.in);
int i;
int vectors[][];
System.out.println("Give the decrypted text: \n");
String encryptedText =  scan.next().toString();
vectors = makeArray();
vectors = countFrequency(vectors, encryptedText);
calculateDeviations(vectors);

// No need to scan more

if(scan!=null)
    scan.close();
}


private static void calculateDeviations(int[][] vectors) {
    int i;
    int j;
    int sumpowfreq;
    int freqpowsum;
    for(i=0;i<12;i++){
        double deviation =0;
        for(j=0; j<26;j++){
            sumpowfreq = sumPowwFreq(vectors,i);
            freqpowsum = freqPowwSum(vectors,i);
            deviation = Math.sqrt((sumpowfreq/26) - (freqpowsum/26));
        }
        System.out.println("The devation of " + j + " is " + deviation + ".");
    }

}


private static int freqPowwSum(int[][] vectors, int i) {
    int powsum=0;
    int sum=0;
    int j;
    for(j=0;j<26;j++){
        sum = sum + vectors[j][i];
    }
    powsum = sum * sum;
    return powsum;
}


public static int sumPowwFreq(int[][] vectors, int i) {
    int sum=0;
    int j;
    for(j=0;j<26;j++){
        sum = sum + (vectors[j][i] * vectors[j][i]);
    }
    return sum;
}

public static int[][] makeArray() {
// Making the 2-dimensional array and set it to 0
    int keySize;
    int letterFrequency[][] = new int[26][11];
    for(keySize=5;keySize<16;keySize++){
        int j;
        for(j=0;j<26;j++){
            letterFrequency[j][keySize-5] = 0;  
            }
        }
    return letterFrequency;
}


public static int[][] countFrequency(int freq[][], String encryptedText){
    int i,j,c;
    int splitSize;
    int ascii;
    String splittedText[];
    for(splitSize=5; splitSize<15; splitSize++){
        splittedText = splitText(splitSize, encryptedText);
        for(j=0;j<splitSize;j++){
            for(c=0;c<splittedText[j].length();c++){
                ascii= splittedText[j].charAt(c);
                ascii = ascii - 97; // because the ascii table starts at 97, 0 represents an 'a' now
                                    // and we assumed that the encrypted text only contained small letters
                freq[ascii][j]++;
            }
        }       
    }   

    return freq;
}


public static String[] splitText(int partLength, String encryptedText){
    int len = encryptedText.length();

    int amountparts = len / (partLength);
    String parts[] = new String[amountparts];

    // Break into parts
    int offset= 0;
    int i = 0;
    while (i < amountparts){
        parts[i] = encryptedText.substring(offset, Math.min(offset + partLength, len));
        offset += partLength;
        i++;
    }

    return parts;
}

}

1 个答案:

答案 0 :(得分:0)

我不是加密,但我进入你的代码并看到异常。 我认为,你的问题相当于特定领域而不是技术......

countFrequency()中的嵌套for循环要求数组splittedText包含至少15个元素。

  • for 1)splitSize从5到14
  • 运行
  • for 2)对于每个splitSize,j运行 从0到splitSize
  • for 3)对于每个j,使用splittedText的第j个元素执行某些操作

最后一个对于例外非常重要:

  

splittedText必须包含至少15个元素。

splittedText中有多少个元素?

这是在splitText(int,String)中确定的。在(for 1)中调用此方法,当前splitSize为partLength,用户输入为encryptedText。 splitText返回一个包含(encryptedText.length()/ partlength)元素的数组。所以我们有:

  

splittedText.length()=(inputlength / splitSize)

对于每个splitSize(5到14),输入长度必须符合以下条件:

input-length / splitSize&gt; = splitSize;这相当于

  

input-length&gt; = splitSize * splitSize

对于splitSize为14,您的输入必须大于196.

据我所知,这不是vigenere-ciphers的约束。并且 - 顺便说一句 - 如果你传递第一个ArrayOutOfBoundException,你将遇到下一个异常。