【问题标题】:StringIndexOutOfBoundsExceptionStringIndexOutOfBoundsException
【发布时间】:2016-03-27 22:09:18
【问题描述】:

我正在制作的这个程序编译不正确,我不断收到错误: 线程“主”java.lang.StringIndexOutOfBoundsException 中的异常:字符串索引超出范围:-9 在 java.lang.String.charAt(String.java:687) 在 pro1.main(pro1.java:161)

这是我的代码:

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);
  }
}

【问题讨论】:

  • 你不能只是把你的整个程序放在这里,然后指望有人通读整个程序并找到你的错误(特别是因为你甚至没有费心去标记抛出的行例外或正确格式化您的问题)。另外:如果程序抛出异常,它显然编译得很好。
  • 你这里有一个错误:length=str1.length()-1; for(int i=0;i&lt;length;i++)。使用i&lt;=lengthlength=str1.length();,否则你会错过最后一个字符。 (显然,这不是错误的原因
  • 你对静态变量有一些疯狂的(ab)使用。你可能也想重构它。
  • 顺便说一句。有一个叫做 debugger 的东西,你可以用它一步一步地检查你的代码并检查变量的值。
  • 欢迎使用 stackoverflow sepp2k。我认为发布代码比问一些你可以谷歌的东西更好。

标签: java string


【解决方案1】:

您的代码在各个方面看起来都很可疑,我无法想象有人想阅读 170 行代码。

查看异常:它准确地告诉您出了什么问题:您将 -9 作为索引传递给 charAt(),这显然超出了范围,因为您应该只传递 0 ... (length-1 ) 在那里。

它还会给你行号...所以转到第 161 行,看看里面有什么以及它是如何到达那里的。

【讨论】:

    【解决方案2】:

    我的猜测可能与这一行有关:

    z=(y-x)%26;
    

    如果 x 大于 y,则 % 操作的结果可能为负(或 0)。并且 charAt (这是 z 作为参数给出的)期望一个正值。 你应该试试:

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

    编辑:作为旁注,通过查看其他人指出的异常,或者在最坏的情况下使用调试器并查看确切的值不同的变量有以及为什么会发生异常。

    【讨论】:

    • 另一个等待发生的索引越界错误是 sbox,因为它只有 26 个字符长,但它的索引从 1 到 26 是随机的。有效索引是从 0 到 25,请记住。
    • 是的,确实,感谢您的意见,我错过了。我想我只关注可能的负指数。给 OP:range=generator.nextInt(26)+1; 应该是 range=generator.nextInt(26);
    • 看起来他希望 (y-x)%26 与 (t+p)%26 相反。 Math.abs(..) 不会那样工作。我通常使用这样的东西来进行负面环绕:z -= x; while (z &lt; 0) z += 26;
    猜你喜欢
    • 1970-01-01
    • 2016-07-14
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 2019-08-30
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    相关资源
    最近更新 更多