2010-06-20 65 views
0

我正在编写的这个程序没有编译正确,我不断收到错误: 线程“main”中的异常java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-9 at 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 2010-06-20 12:17:40

+0

这里有一个错误:'length = str1.length() - 1; for(int i = 0; i 2010-06-20 12:28:17

+0

你有一些疯狂的(ab)使用静态变量。你可能也想重构它。 – 2010-06-20 12:32:15

回答

4

你的代码看起来腥以各种方式,我无法想象任何人想要阅读这段代码的170行。

看看例外情况:它告诉你到底发生了什么问题:你将charAt()作为索引传递给-9,显然超出了范围,因为你应该只传递0 ...(length- 1)在那里。

它也给你行号......所以去行号161,看看里面有什么,以及它是如何到达那里。

3

我的猜测是它有事情做这一行:

z=(y-x)%26; 

如果x比y的%操作的结果可能是负的较大(或0)。 charAt(这是z给出的参数)预期为正值。 你应该尝试:

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

编辑:作为一个方面说明,这不应该是很难,因为指出别人找出你自己,通过查看异常,或者在最坏的情况下使用调试器并准确查看不同变量具有的值以及发生异常时的原因。

+0

等待发生的另一个索引超出边界的错误是sbox,因为它只有26个字符长,但是它的索引从1到26是随机的。记住,有效索引从0到25。 – Gunslinger47 2010-06-20 13:17:07

+0

是的,的确,感谢您的意见,我错过了这一点。我想我只关注可能的负面指数。对于OP:'range = generator.nextInt(26)+1;'应该是'range = generator.nextInt(26);' – 2010-06-20 15:23:39

+0

看起来他希望(yx)%26是(t + p )%26。 Math.abs(..)不会那样工作。我通常使用类似这样的东西来进行负面环绕:'z - = x;而(z <0)z + = 26;' – Gunslinger47 2010-06-20 19:21:30

相关问题