2010-06-20 23 views
0

Эта программа, которую я делаю не компиляции правильно, я получаю ошибку: Исключение в потоке «основной» java.lang.StringIndexOutOfBoundsException: индекс Струнный вне диапазона: -9 в java.lang.String .charAt (String.java:687) в pro1.main (pro1.java:161)StringIndexOutOfBoundsException

Вот мой код:

import java.io.*; 
import java.util.*; 
public class pro1 { 
    static String str=""; 
    static String str1=""; 
    static int range=250; 
    static int length; 
    static String key=""; 
    static String ep=""; 
     static String pt=""; 
    static char temp; 
    static int t,p,h; 
    static int r,x,y,z,w; 
    static Random generator = new Random(); 
static public String getContents(File aFile) 
    { 
    StringBuilder contents = new StringBuilder(); 
    try { 
     BufferedReader input = new BufferedReader(new FileReader(aFile)); 
     try { 
     String line = null; 
     while ((line = input.readLine()) != null){ 
      contents.append(line); 
      contents.append(System.getProperty("line.separator")); 
     } 
     } 
     finally { 
     input.close(); 
     } 
    } 
    catch (IOException ex){ 
     ex.printStackTrace(); 
    } 
    str1=contents.toString(); 
    return str1; 
    } 



public static void main (String args[]) throws IOException { 
     File testFile = new File("/home/amritha/Desktop/sam.txt"); 
     System.out.println("Original file contents: " + getContents(testFile)); 
     System.out.println("message:"+str1); 
     String sbox="abcdefghijklmnopqrstuvwxyz"; 
     length=str1.length()-1; 
     for(int i=0;i<length;i++) 
     { 
      t=(int)str1.charAt(i); 
      if(t==32) 
       { 
       int t1=32; 
       temp=(char)t; 
       } 
      else 
       { 
       range=generator.nextInt(26)+1; 
       temp=sbox.charAt(range); 
       } 
       key+=""+temp; 
     } 
     System.out.println("Key:"+key); 
     for(int i=0;i<length;i++) 
     { 
     t=(int)str1.charAt(i); 
      { 
      if(t==32) 
      { 
       t=32; 
       temp=(char)t; 
      } 
      else 
      { 
       t-=97; 
      } 
      } 
     p=(int)key.charAt(i); 
      { 
      if(p==32) 
      { 
       p=32; 
       temp=(char)p; 
      } 
      else 
      { 
       p-=97; 
      } 
      } 
     if((t==32)&&(p==32)) 
      { 
       int v=32; 
       temp=(char)v; 
      } 
      else 
      { 
      r=(t+p)%26; 
      temp=sbox.charAt(r); 
      } 
      ep+=""+temp; 
     } 
     System.out.println("Encrypted Text:"+ep); 

    for(int i=0;i<length;i++) 
     { 
     y=(int)ep.charAt(i); 
      { 
      if(y==32) 
      { 
       y=32; 
       temp=(char)y; 
      } 
      else 
      { 
       y-=97; 
      } 
      } 
     x=(int)key.charAt(i); 
      { 
      if(x==32) 
      { 
       x=32; 
       temp=(char)x; 
      } 
      else 
      { 
       x-=97; 
      } 
      } 
     if((x==32)&&(y==32)) 
      { 
       int w=32; 
       temp=(char)w; 
      } 
      else 
      { 
      z=(y-x)%26; 
      temp=sbox.charAt(z); 
      } 
      pt+=""+temp; 
     } 
     System.out.println("deccrypted Text:"+pt); 
    } 
} 
+9

Вы не можете просто разместить всю свою программу здесь и ожидать, что кто-то прочитает все это и найдет вашу ошибку (особенно, поскольку вы даже не столкнулись с проблемой, чтобы отметить линию, которая генерирует исключение или правильно форматирует ваш вопрос). Кроме того: если программа выдает исключение, она явно скомпилировалась просто отлично. – sepp2k

+0

У вас есть ошибка: 'length = str1.length() - 1; for (int i = 0; i

+0

У вас есть сумасшедшие (ab) использование статических переменных. Возможно, вы захотите реорганизовать это. –

ответ

4

Ваш код выглядит подозрительным во всех отношениях, и я не могу себе представить, кто хочет чтобы прочитать 170 строк этого кода.

Посмотрите на исключение: он сообщает вам, что именно происходит: вы передаете -9 в charAt() как индекс, который, очевидно, выходит за пределы диапазона, так как вы должны пропускать только 0 ... (длина- 1).

И он также дает вам номер строки ... так что перейдите к строке 161 и посмотрите, что там и как оно там добралось.

3

Мое предположение было бы это что-то делать с этой линией:

z=(y-x)%26; 

Если х больше, чем у результат операции% может быть отрицательным (или 0). И charAt (который является тем, что z задан как параметр), ожидает положительное значение. Вы должны попробовать:

z=Math.abs(y-x)%26; 

Edit: Как примечание стороны, это не должно быть трудно выяснить самостоятельно, посмотрев на исключение, как было отмечено другими, или в худшем случае используя отладчик и видя точно, какие значения имеют разные переменные, и почему, когда возникает исключение.

+0

Еще одна ошибка из-за границы, ожидающая появления, - это sbox, так как она всего 26 символов, но она индексируется случайным образом от 1 до 26. Допустимые индексы от 0 до 25, помните. – Gunslinger47

+0

Да, действительно, спасибо за вход, я пропустил это. Наверное, я только обратил внимание на вероятные отрицательные показатели. Для OP: 'range = generator.nextInt (26) +1;' должен быть 'range = generator.nextInt (26);' –

+0

Похоже, он хотел, чтобы (yx)% 26 был обратным (t + p)% 26. Math.abs (..) не сработает. Обычно я использую что-то вроде этого для отрицательной обертки: 'z - = x; while (z <0) z + = 26; ' – Gunslinger47

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