0

プログラムを実行しようとすると、次のエラーが発生します...

 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;
                }
            }
        }
    }
}
4

8 に答える 8

1

yループが2番目のワードに進むときに、内側のループでリセットしないでくださいy。3ですが、words[x].charAt(y)x= 1)は存在しません。範囲外です。

于 2011-12-12T10:18:36.260 に答える
1

たぶんあなたは最後から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;

確認してください

于 2011-12-12T10:22:12.563 に答える
1

配列wordsの2番目の単語は2文字のみで構成されており、次のコードwords [x] .charAt(y)によってその単語の4番目の文字にアクセスしようとしていますが、yは3に等しいため、範囲外です。単語ma

于 2011-12-12T10:24:00.833 に答える
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を適切にリセットして、期待される動作を実現してください。

あなたはそのような間違いを見つけるためにそれをデバッグすることによってあなたのプログラムを分析することができます。

于 2011-12-12T10:21:14.853 に答える
0

申し訳ありませんが、あなたが私に何を言おうとしているのか、私にはまったくわかりません。私のコードは少し厄介に見えますが、それは私がまだそれを行う方法を誰も教えてくれなかった原因です。SOまたはIDEに関しては。私はそれが何を意味するのかIDEaを持っていません。

(IDEはInteractive Development Environmentの略です。たとえば、Eclipse、NetBeans、IDEAなどです。SOはStack Overflowの略です。SOが質問と回答の記述とフォーマットに提供する単純なwiki言語を指します。)

Javaスタイルのルールを学習/教えられていない場合は、このドキュメントを読むために時間を費やす必要があります-JavaTMプログラミング言語のコード規約。他にもJavaスタイルガイドがあります...お好きなものをお選びください。優れたスタイルの重要なポイントの1つは、コードを一貫してインデントすることです。

スタイル規則の理由は、自分や他の人のコードを読みやすくするためです。そして、あなたのキュービクルに悪臭爆弾をロビー活動する同僚の発生を避けるために。

(私があなたに厳しいと思うなら、職場環境で最初の完全なコードレビューを経験するまで待ってください...)

于 2011-12-12T10:24:20.677 に答える
0

あるループから別のループへの問題は、ほとんどの場合、ループを実行するために使用する変数を再初期化するのを忘れていることです。すべてのループの後で、変更した可能性のある変数を再初期化することをお勧めします。必要なステップである場合もありますが、それは良いルーチンです...

Nimが言うように、問題はy再初期化されないことです...

于 2011-12-12T10:26:06.917 に答える
0

コードの目的がわかりませんが、checkメソッドが単語paramを入力するのはわかりますが、それを使用していません。単語の代わりに単語を使用したPehraps?

于 2011-12-12T10:28:44.427 に答える
0

yデバッガーはそれを明確にします:それが単語「ma」で実行されるとき、あなたのインデックスは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;
    }
}
于 2011-12-12T10:36:38.357 に答える