为什么我会出现一个outofbounds错误?

时间:2015-08-26 00:02:25

标签: java

我一直在线程“main”

中得到一个异常
  

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

public NewClass()
{

}

public char[] startGame()
{
    char[] virusB = new char[100];
    String virus;
    Scanner scan = new Scanner(System.in);
    System.out.print("Enter your message");
    virus = scan.nextLine();
    for(int i=0; i<virusB.length+1; i++)
    {                   
        virusB[i]= virus.charAt(i);
    }  
    virusA = virusB;

    return virusA;             
}

4 个答案:

答案 0 :(得分:2)

看起来字符串virus不够长:

    char[] virusB = new char[100];
     String virus = scan.nextLine();
     for(int i=0; i<virusB.length+1; i++)
     {                   
     virusB[i]= virus.charAt(i);

你迭代到virusB的结尾+ 1,其长度为100, 根据您的错误消息判断,virus的长度为5。

例如,如果scan.nextLine()返回&#34; hello&#34;,这将在循环中发生:

virusB[0] = virus.charAt(0);  // 'h'
virusB[1] = virus.charAt(1);  // 'e'
virusB[2] = virus.charAt(2);  // 'l'
virusB[3] = virus.charAt(3);  // 'l'
virusB[4] = virus.charAt(4);  // 'o'
virusB[5] = virus.charAt(5);  // -> boom
// ...

您需要修复循环条件:

  1. 也考虑virus.length()
  2. 限制virusB.length + 1也是错误的
  3. 换句话说:

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

    但最好的可能是简化整个事情:

    public char[] startGame() {
         System.out.print("Enter your message");
         return new Scanner(System.in).nextLine().toCharArray();
    }
    

答案 1 :(得分:1)

你的例外可能是由于这一行:

virusB[i]= virus.charAt(i);

i可以达到virusB数组或100个元素的长度。但是用户输入的字符串可能比这小得多。假设用户输入11个字符:您的循环可能会尝试访问该字符串末尾的字符,因此您的异常

特定的例外情况表明,导致异常的用户输入的字符串只有4个字符。

防止这种情况的一种方法是在循环终止条件中添加一个检查,这样就不会在virus字符串的末尾运行,例如:

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

同样,i<virusB.length+1的现有循环终止条件也可能导致异常。数组是零索引,因此访问索引virusB.length的元素也不合格。

答案 2 :(得分:1)

你遇到的问题是:

virusB[i]= virus.charAt(i);

因为如果virus length小于100它会失败(因为你的for循环直到virusB长度)。

我建议您将if条件更改为病毒而不是数组。像这样:

for(int i=0; i<virus.length; i++)
{                   
    virusB[i]= virus.charAt(i);
}  

使用此方法,您将避免病毒的长度低于阵列的长度。

编辑:我之前的解释是什么意思,当您尝试访问不存在的String的位置时,它永远都会崩溃。例如,如果您有以下String

String prove = "This is a prove";

从你的位置16100,你的陈述中会失败:

virusB[i]= virus.charAt(i);

因为virus String没有足够的长度来允许函数charAt正常工作(它会尝试访问String的位置,而不是account day type a 1 X b 1 Y c 1 Z a 2 Y b 2 Z c 3 Z 。 t存在)。

我希望它会对你有所帮助!

答案 3 :(得分:0)

您正在检查循环中的索引virusB.length[i]+1。你的char数组只有100个字符,这个循环将迭代100次,这意味着在循环的最后一次调用中,它将尝试访问索引100,该索引100不存在,因为数组从0开始索引。

试试virusB.length[i]