Строковый индекс выходит за границы ошибки, не могу найти корень ошибки - PullRequest
0 голосов
/ 12 декабря 2011

Когда я пытаюсь запустить мою программу, выдается следующая ошибка ...

 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 ]

1 голос
/ 12 декабря 2011

2-е слово в массиве words состоит только из 2 букв, и вы пытаетесь получить доступ к 4-й букве в этом слове с помощью следующего кода words [x] .charAt (y) но y равно 3 , что не входит в число слов ma

1 голос
/ 12 декабря 2011

Может быть, вы должны очистить y после последнего для?

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;

проверь

1 голос
/ 12 декабря 2011

Вы не сбрасываете y во внутреннем цикле, когда цикл переходит ко второму слову, y равно 3, но words[x].charAt(y) (где x = 1) не существует - его нетграниц.

0 голосов
/ 12 декабря 2011

Отладчик проясняет: ваш индекс y имеет значение 3, когда он выполняется на слове "ma".Вы не должны использовать это значение цикла в этой области.

Я не уверен, что понимаю вашу логику, но это не должно занять слишком много времени.

Ваш переформатированный код будет выглядеть такэто:

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;
    }
}
0 голосов
/ 12 декабря 2011

Я не могу понять, для чего предназначен код, но я вижу, что метод check принимает на вход слово param, но не использует его.Пехрапс, ты использовал слова вместо слова?

0 голосов
/ 12 декабря 2011

Проблема с одним циклом в другом состоит в том, что большую часть времени мы забываем повторно инициализировать переменные, которые мы используем для цикла. Я рекомендую вам после каждого цикла повторно инициализировать переменные, которые вы можете изменить, иногда это необязательный шаг, но это хорошая процедура ...

Как говорит Ним, проблема в том, что y никогда не инициализируется повторно ...

0 голосов
/ 12 декабря 2011

Я действительно понятия не имею, что ты пытаешься мне сказать, извини, приятель. Мой код выглядит немного грязно, да, но это потому, что никто не научил меня, как я должен это делать. как для SO или IDE. У меня так нет ИДЕИ, что это значит.

(IDE обозначает Интерактивную среду разработки. Например, Eclipse, NetBeans, IDEA и т. Д. SO означает переполнение стека. Я имею в виду простой вики-язык, который SO предоставляет для написания и форматирования Вопросов и Ответов.)

Если вы не изучили / не научились правилам стиля Java, вам следует потратить время на чтение этого документа - Условные обозначения для языка программирования Java TM . Есть и другие руководства по стилю Java ... выбирайте сами. Одним из ключевых моментов хорошего стиля является последовательный отступ кода.

Причиной использования стилевых соглашений является упрощение чтения кода вашего и других людей. И чтобы избежать случаев, когда коллеги по работе бросают вонючие бомбы в вашу кабину.

(Если вы думаете, что я жестко обращаюсь с вами, просто подождите, пока вы не испытаете свой первый полный обзор кода в рабочей среде ...)

0 голосов
/ 12 декабря 2011

Для некоторых слов индекс, указанный 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 в цикле, чтобы получить ожидаемое поведение.

Вы можете проанализировать вашу программу, отладив ее, чтобы обнаружить такие ошибки.

...