字符串索引越界错误,无法找到错误的根

时间:2011-12-12 10:11:21

标签: java string indexing bounds indexoutofboundsexception

当我尝试运行程序时,会出现以下错误...

 Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 3
    at java.lang.String.charAt(Unknown Source)
    at Woordzoeker.check(Woordzoeker.java:88)
    at Woordzoeker.main(Woordzoeker.java:8)

我知道String可能超越了数组的边界,但我似乎无法理解为什么。有人可以帮我理解这个问题。

这是我的代码......

public class Woordzoeker {
    public static String[] words = {"boom","ma","maat","kas","kast","as","boek","boot"};
    public static String[][] grid = {{"b","o","e","k"},{"o","o","z","a"},{"o","j","o","s"},{"m","a","a","t"}};
    public static String[][] gridz = new String[4][4];

    public static void main(String[] args) {
        for (int x=0; x < words.length-1; x++){
            System.out.println(words[x] + " --> " + check(words[x],grid));
        } // THIS IS LINE 8
        System.out.println(isCorrectGrid(grid));
        System.out.println(isCorrectWords(words));
        }

public static int[] check(String word, String[][] grid){
    int[] array = new int[3];
    int y = 0;
    for (int rij=0; rij < grid.length; rij++){
        for (int kolom = 0;kolom < grid[rij].length; kolom++){
            for (int x=0; x < words.length - 1; x++)
                if (words[x].charAt(y) == (grid[rij][kolom].charAt(0))){  // THIS IS LINE 88
                    array[0] = rij;
                    array[1] = kolom;  // slaat de begin coordinaten op
            for (y = 0; y < words[x].length() - 1; y++){
                if (words[x].charAt(y) == grid[rij + y][kolom].charAt(0)){
                    array[2] = 1;
                }
                if (words[x].charAt(y) == (grid[rij][kolom + y].charAt(0))){
                    array[2] = 2;
                }
                if (words[x].charAt(y) == (grid[rij + y][kolom + y].charAt(0))){
                    array[2] = 3;
                }
            }
        }
    }
}

8 个答案:

答案 0 :(得分:1)

你不会在内循环中重置y,当循环进入第二个单词时,y是3,但是words[x].charAt(y)(其中x = 1 )不存在 - 它超出范围。

答案 1 :(得分:1)

也许你应该在最后一次之后清除?

for (y = 0; y < words[x].length() - 1; y++){
   if (words[x].charAt(y) == grid[rij + y][kolom].charAt(0)){
   array[2] = 1;
   }
   if (words[x].charAt(y) == (grid[rij][kolom + y].charAt(0))){
   array[2] = 2;
   }
   if (words[x].charAt(y) == (grid[rij + y][kolom + y].charAt(0))){
   array[2] = 3;
   }

}
y=0;

检查

答案 2 :(得分:1)

数组单词中的第二个单词只由2个字母组成,您试图通过以下代码单词[x] .charAt(y)访问该单词中的第4个字母)但是y等于 3 ,它超出了单词 ma

的范围

答案 3 :(得分:0)

对于某些单词,y指定的索引不存在。

         if (words[x].charAt(y) == (grid[rij][kolom].charAt(0))) //in this line If the words is "ma" then charAt(y=3) does not exist ,hence the error .

尝试在循环中正确重置y以提供预期的行为。

您可以通过调试程序来分析程序,以找出这些错误。

答案 4 :(得分:0)

  

我真的不知道你想告诉我什么,对不起伙伴。我的代码看起来有点凌乱,但那是因为没有人告诉我应该怎么做呢。至于SO或IDE。我没有IDEa意味着什么。

(IDE代表交互式开发环境。例如Eclipse,NetBeans,IDEA等。 SO代表Stack Overflow。我指的是SO提供的简单wiki语言,用于编写和格式化问题和答案。)

如果您还没有学习/学过Java风格的规则,那么您应该花时间阅读本文档 - Code Conventions for the Java TM Programming Language。还有其他Java风格指南......随便挑选。良好风格的关键点之一是始终如一地缩进代码。

风格惯例的原因是为了让您更容易阅读自己和其他人。码。并且为了避免工友们将恶臭炸弹扔进你的隔间。

(如果您认为我对您很难,请等到您在工作场所环境中体验首次完整的代码审查......)

答案 5 :(得分:0)

一个循环进入另一个循环的问题是大多数时候我们忘记重新使用我们用来执行循环的变量。我建议你在每次循环之后,重新定义你可能改变的变量,有时是一个不必要的步骤,但它是一个很好的例程......

正如Nim所说,问题是y永远不会重新初始化......

答案 6 :(得分:0)

我无法确定代码是什么,但我看到check方法接受输入一个单词参数,但它不使用它。 Pehraps你用词代替词?

答案 7 :(得分:0)

调试器清楚地表明:当对单词“ma”执行时,索引y的值为3。您不应该在该范围内使用该循环值。

我不确定我理解你的逻辑,但不应该花太长时间。

您重新格式化的代码如下所示:

public class Woordzoeker {
    public static String[] words = {"boom", "ma", "maat", "kas", "kast", "as", "boek", "boot"};
    public static String[][] grid = {{"b", "o", "e", "k"}, {"o", "o", "z", "a"}, {"o", "j", "o", "s"}, {"m", "a", "a", "t"}};
    public static String[][] gridz = new String[4][4];

    public static void main(String[] args) {
        for (int x = 0; x < words.length - 1; x++) {
/* --> */
            System.out.println(words[x] + " --> " + check(words[x], grid));
        }
    }

    public static int[] check(String word, String[][] grid) {


        int[] array = new int[3];
        int y = 0;
        for (int rij = 0; rij < grid.length; rij++) {
            for (int kolom = 0; kolom < grid[rij].length; kolom++) {
                for (int x = 0; x < words.length - 1; x++) {
                    /*-->*/
                    if (words[x].charAt(y) == (grid[rij][kolom].charAt(0))) {
                        array[0] = rij;
                        array[1] = kolom;  // slaat de begin coordinaten op
                        for (y = 0; y < words[x].length() - 1; y++) {
                            if (words[x].charAt(y) == grid[rij + y][kolom].charAt(0)) {
                                array[2] = 1;
                            }
                            if (words[x].charAt(y) == (grid[rij][kolom + y].charAt(0))) {
                                array[2] = 2;
                            }
                            if (words[x].charAt(y) == (grid[rij + y][kolom + y].charAt(0))) {
                                array[2] = 3;
                            }

                        }
                    }
                }
            }
        }

        return array;
    }
}