Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java StringIndexOutOfBoundsException_Java_String - Fatal编程技术网

Java StringIndexOutOfBoundsException

Java StringIndexOutOfBoundsException,java,string,Java,String,我正在制作的程序没有正确编译,我不断收到错误: 线程“main”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=

我正在制作的程序没有正确编译,我不断收到错误: 线程“main”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);
  }
}
import java.io.*;
导入java.util.*;
公共类pro1{
静态字符串str=“”;
静态字符串str1=“”;
静态整数范围=250;
静态整数长度;
静态字符串键=”;
静态字符串ep=“”;
静态字符串pt=“”;
静态炭温;
静态int t,p,h;
静态整数r,x,y,z,w;
静态随机生成器=新随机();
静态公共字符串getContents(文件文件)
{
StringBuilder内容=新建StringBuilder();
试一试{
BufferedReader输入=新的BufferedReader(新文件读取器(aFile));
试一试{
字符串行=null;
而((line=input.readLine())!=null){
内容。追加(行);
append(System.getProperty(“line.separator”);
}
}
最后{
input.close();
}
}
捕获(IOEX异常){
例如printStackTrace();
}
str1=contents.toString();
返回str1;
}
公共静态void main(字符串args[])引发IOException{
File testFile=新文件(“/home/amritha/Desktop/sam.txt”);
System.out.println(“原始文件内容:”+getContents(testFile));
System.out.println(“消息:+str1”);
字符串sbox=“abcdefghijklmnopqrstuvxyz”;
长度=str1.length()-1;

对于(inti=0;i,您的代码在各个方面都看起来可疑,我无法想象有人想要阅读170行代码

看看异常:它确切地告诉您出了什么问题:您将-9作为索引传递给charAt(),这显然超出了范围,因为您应该只在其中传递0…(长度-1)


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

我猜它与这条线有关:

z=(y-x)%26;
如果x大于y,则%运算的结果可能为负值(或0)。而charAt(z作为参数指定给它)期望为正值。 你应该试试:

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

编辑:作为一个旁注,这应该不难自己弄清楚,通过查看别人指出的异常,或者在最坏的情况下使用调试器,查看不同变量的值以及异常发生的原因。

你不能把整个程序放在这里,期望有人阅读thr通过整个过程并找到错误(特别是因为您甚至没有费劲标记引发异常的行或正确设置问题的格式)。此外:如果程序引发异常,它显然编译得很好。这里有一个错误:
length=str1.length()-1;for(int i=0;i您有点疯狂(ab)使用静态变量。你可能也想重构它。顺便说一句。有一种叫做调试器的东西,你可以用它一步一步地检查你的代码,并检查变量的值。wlecome to stackoverflow sepp2k。我认为发布代码比用谷歌搜索更合适。另一个索引越界错误等待happen是sbox,因为它只有26个字符长,但它的索引是随机的,从1到26。有效的索引是从0到25,记住。是的,确实,感谢您的输入,我错过了。我想我只是在注意可能的负索引。to OP:
range=generator.nextInt(26)+1;
应该是
range=generator.nextInt(26)看起来他希望(y-x)%26是(t+p)%26的倒数。Math.abs(..)不会那样工作。我通常用这样的东西来表示负环绕:
z-=x;而(z<0)z+=26;