Java 为什么我会出现边界外错误?

Java 为什么我会出现边界外错误?,java,Java,我一直在线程“main”中遇到异常 java.lang.StringIndexOutOfBoundsException:字符串索引超出范围: 5在java.lang.String.charAt(String.java:658)处 hackman.NewClass.startGame(NewClass.java:31)位于 hackman.Decipher.main(Decipher.java:65) public新类() { } public char[]startGame() { char[]

我一直在线程“main”中遇到异常

java.lang.StringIndexOutOfBoundsException:字符串索引超出范围: 5在java.lang.String.charAt(String.java:658)处 hackman.NewClass.startGame(NewClass.java:31)位于 hackman.Decipher.main(Decipher.java:65)

public新类()
{
}
public char[]startGame()
{
char[]virusB=新字符[100];
串病毒;
扫描仪扫描=新扫描仪(System.in);
系统输出打印(“输入您的消息”);
virus=scan.nextLine();

对于(int i=0;i您正在检查循环中的索引
virusB.length[i]+1
。您的字符数组只有100个字符,此循环将迭代100次,这意味着在循环中的最后一次调用时,它将尝试从0访问不作为数组索引存在的索引100


请尝试
virusB.length[i]

您的异常可能是由于以下几行造成的:

virusB[i]= virus.charAt(i);
i
可以是您的
virusB
数组的长度,也可以是100个元素。但是用户输入的字符串可能要小得多。假设用户输入11个字符:您的循环可以尝试访问超过该字符串末尾的字符,因此出现异常

特定异常表明导致异常的用户输入的字符串只有4个字符

防止这种情况的一种方法是在循环终止条件中添加一个检查,这样您就不能运行
病毒
字符串的末尾,类似于:

for (int i = 0; (i < virusB.length) && (i < virus.length()); i++)
for(inti=0;(i

类似地,
i的现有循环终止条件看起来像是字符串
virus
不够长:

您需要修复循环条件:

  • 还要考虑
    virus.length()
  • 限制
    virusB.length+1
    也是错误的
  • 换言之:

     for (int i = 0; i < virus.length() && i < virusB.length; i++) {
         // ...
     }
    

    你的问题就在这里:

    virusB[i]= virus.charAt(i);
    
    因为如果您的
    病毒长度
    小于
    100
    它将失败(因为您在
    virusB
    长度之前一直进行for循环)

    我建议您将if条件改为病毒长度,而不是数组长度。如下所示:

    for(int i=0; i<virus.length; i++)
    {                   
        virusB[i]= virus.charAt(i);
    }  
    
    从您的职位
    16
    100
    您的陈述将失败:

    virusB[i]= virus.charAt(i);
    
    因为
    病毒字符串
    没有足够的长度来允许函数
    字符
    正常工作(它将尝试访问
    字符串
    不存在的位置)


    我希望它会对你有帮助!

    I
    一个灾难的配方。说真的。你应该问问自己,为什么这不会导致索引越界问题。你需要检查病毒的长度。你的循环对于数组来说也太长(1)。你为什么要将字符串复制到
    char[]
    不管怎样?我所看到的只是一大堆努力试图解决这个问题,
    I
    循环太长(1)你说得对,合并我们的答案,这将是完全正确的!@Alex和Thilo你说得对,但问题的这一部分在我提到之前就被删掉了that@pb2q我讨厌这种情况发生。对不起,我只是把它放在他们的文件中,看看它是否能修复它,但它不适用于只有virusB.length@alexThere还有
    String#toCharArray
    @Thilo是的,这也可能是另一种选择。但是去罗马有很多方法;)只是我这么做是为了不改变OP的逻辑。当然。当人们解释为什么他们首先需要去罗马时,这总是有帮助的。
    public char[] startGame() {
         System.out.print("Enter your message");
         return new Scanner(System.in).nextLine().toCharArray();
    }
    
    virusB[i]= virus.charAt(i);
    
    for(int i=0; i<virus.length; i++)
    {                   
        virusB[i]= virus.charAt(i);
    }  
    
    String prove = "This is a prove";
    
    virusB[i]= virus.charAt(i);