2014-09-18 5 views
-2

Я делаю небольшую программу, чтобы угадать длину ключа вигнере-шифра с заданной длиной между 5-15 , в пределах java. Я делаю это, вычисляя стандартные отклонения из-за перестановок. Но мой реальный вопрос в том, почему я получаю ошибку из-за границы в массиве метода «countFrequency». Я не могу видеть, где это выходит за пределы.Почему компилятор дает «java.lang.ArrayIndexOutOfBoundsException: x -error? (Размер зависит от ввода)

Я знаю, что моя программа могла бы быть намного более эффективным, но я думаю, что он должен работать, как только фиксируется эта ошибка. Мой код программы ниже.

Спасибо!

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

'java.lang.ArrayIndexOutOfBoundsException' - это исключение во время выполнения. Компилятор не может сообщить об этом. – dasblinkenlight

+0

Покажите нам стек. –

+0

Положите точку останова на строку ошибки и посмотрите, что получилось плохо :) –

ответ

0

Я не крипто-урод, но я вошел в свой код и увидел исключение. Я думаю, ваша проблема скорее специфична для домена, чем техническая ...

Вложенные для циклов в countFrequency() ожидает, что массив splittedText содержит не менее 15 элементов.

  • 1) splitSize проходит от 5 до 14
  • для 2) для каждого splitSize, J пробегает от 0 до splitSize
  • для 3) для каждого J, сделать что-то с -м элементом splittedText

Последнее для имеет важное значение для Exception:

splittedText должен содержать по меньшей мере 15 элементов.

Сколько элементов в splittedText?

Это определяется в splitText (int, String). Этот метод вызывается внутри (для 1) с текущим splitSize как partLength и пользовательским вводом как encryptedText. splitText возвращает массив с элементами (encryptedText.length()/partlength). Итак, мы имеем:

splittedText.length() = (InputLength/splitSize)

Для каждого splitSize (от 5 до 14), то InputLength должен иметь следующие условия:

вход -length/splitSize> = splitSize; и это эквивалентно

ввода длины> = splitSize * splitSize

для splitSize 14, ваш вход должен быть больше, чем 196.

Насколько я читал, это не является ограничением для vigenere-ciphers. И - btw - если вы передадите это первое исключение ArrayOutOfBoundException, вы столкнетесь с следующим Исключением.

 Смежные вопросы

  • Нет связанных вопросов^_^