0

解決できない ArrayIndexOutOfBoundsException を取得しています。

簡単に言えば、文字、数字、およびその他の 7 つのカテゴリの一般的なオブジェクトの名前を学習するための子供向けアプリです。オブジェクト/文字/数字の画像と、その下のテキストに名前が表示され、オブジェクトをタップすると、対応する名前の音声が表示されます。

ユーザーは英語またはアラビア語を選択できます。

アラビア文字以外はすべて機能しますが、例外はアラビア語テキストの文字の文字列配列に対してスローされます。

機能する小さなカテゴリの例を次に示します。

        if (categoryNumber == 2) {
        //Colors
        Resources resources = getResources();
        items = resources.getStringArray(R.array.colors);
        if (language == 0) {            
            if (letter == 0) {
                items = resources.getStringArray(R.array.colors);
            }
            if (letter == 1) {
                items = resources.getStringArray(R.array.colors_caps);
                }
            if (letter == 2) {
                items = resources.getStringArray(R.array.colors_mixed);
            } 
        } else if (language == 1 ) {
            items = resources.getStringArray(R.array.colors_arabic);
        }

例として含まれる最初の文字列配列:

    <string-array name="colors">
    <item>red</item>
    <item>yellow</item>
    <item>blue</item>
    <item>green</item>
    <item>pink</item>
    <item>orange</item>
    <item>black</item>
    <item>white</item>
    <item>brown</item>
    <item>purple</item>
    <item>gold</item>
    <item>silver</item>
</string-array>

およびそれに対応するアラビア配列:

    <string-array name="colors_arabic">
    <!-- red -->
    <item>أحمر</item>
    <!-- yellow -->
    <item>أصفر</item>
    <!-- blue -->
    <item>أزرق</item>
    <!-- green -->
    <item>أخضر</item>
    <!-- pink -->
    <item>وردي</item>
    <!-- orange -->
    <item>البرتقالي</item>
    <!-- black -->
    <item>أسود</item>
    <!-- white -->
    <item>أبيض</item>
    <!-- brown -->
    <item>بني</item>
    <!-- purple -->
    <item>بنفسجي</item>
    <!-- gold -->
    <item>ذهبي</item>
    <!-- silver -->
    <item>فضي</item>
</string-array>

ただし、「文字」のカテゴリになると、重要な違いがあります。アラビア語のアルファベットは 28 文字であるのに対し、英語は 26 文字です。

「文字」カテゴリのコードは次のとおりです。

        if (categoryNumber == 3) {
        //Letters
        Resources resources = getResources();
        if(language == 0) {
            if (letter == 0) {
                items = resources.getStringArray(R.array.letters);
                }
            if (letter == 1) {
                items = resources.getStringArray(R.array.letters_caps);
                }
            if (letter == 2) {
                items = resources.getStringArray(R.array.letters_mixed);
                }               
        } else if (language == 1) {
            items = resources.getStringArray(R.array.letters_arabic);
        }

および対応するアラビア配列:

    </string-array>
    <string-array name="letters_arabic">
    <!-- arabicletterone  -->
    <item>أ</item>
    <!-- arabiclettertwo -->
    <item>ب</item>
    <!-- arabicletterthree -->
    <item>ت</item>
    <!-- arabicletterfour -->
    <item>ث</item>
    <!-- arabicletterfive -->
    <item>ج</item>
    <!-- arabiclettersix -->
    <item>ح</item>
    <!-- arabicletterseven -->
    <item>خ</item>
    <!-- arabiclettereight -->
    <item>د</item>
    <!-- arabicletternine -->
    <item>ذ</item>
    <!-- arabicletterten -->
    <item>ر</item>
    <!-- arabiclettereleven -->
    <item>ز</item>
    <!-- arabiclettertwelve -->
    <item>س</item>
    <!-- arabicletterthirteen -->
    <item>ش</item>
    <!-- arabicletterfourteen -->
    <item>ص</item>
    <!-- arabicletterfifteen -->
    <item>ض</item>
    <!-- arabiclettersixteen -->
    <item>ط</item>
    <!-- arabicletterseventeen -->
    <item>ظ</item>
    <!-- arabiclettereighteen -->
    <item>ع</item>
    <!-- arabicletternineteen -->
    <item>غ</item>
    <!-- arabiclettertwenty -->
    <item>ف</item>
    <!-- arabiclettertwentyone -->
    <item>ق</item>
    <!-- arabiclettertwentytwo -->
    <item>ك</item>
    <!-- arabiclettertwentythree -->
    <item>ل</item>
    <!-- arabiclettertwentyfour -->
    <item>م</item>
    <!-- arabiclettertwentyfive -->
    <item>ن</item>
    <!-- arabiclettertwentysix -->
    <item>ه</item>
    <!-- arabiclettertwentyseven -->
    <item>و</item>
    <!-- arabiclettertwentyeight -->
    <item>ي</item>
</string-array>

私が得るエラーは次のとおりです。

09-01 20:14:07.741: E/AndroidRuntime(4577): java.lang.RuntimeException: アクティビティ ComponentInfo を開始できません {com.allababiditech.academics/com.allababiditech.academics.LevelOneActivity}: java.lang.ArrayIndexOutOfBoundsException: 長さ=27; インデックス=28

英字を使用して 28 項目のまったく異なる配列を代用すると、同じ例外が発生します。

英字のテキスト配列に置き換えると、アラビア語の画像と音声が正常に機能します (少なくとも最初の 26 個)。

英語のテキスト配列を使用して 2 つの重複した英語の文字を追加すると、同じ例外が発生し、長さとインデックスがさらに 2 つずれます。

英語またはアラビア語の他のカテゴリのテキスト配列のいずれかを代わりに使用すると、アラビア語の画像と音声は、配列に含まれるテキスト項目が 26 個以下である限り、テキスト項目の数に対して機能します。(「文字」は、すべてのカテゴリの中で最も長い配列です。)

items.length が 26 ではなく 28 になるような文字列配列内の項目の数にすべてが基づいているため、英語の文字よりもアラビア語の文字の方が多いことは問題ではないと思います。

私は一日中モニターに向かって頭を悩ませてきましたが、誰かが覗いて、私が見ていない本当に単純で明白な間違いを指摘することを気にしないことを願っています. 本当にありがとう。

編集:申し訳ありませんが、これは非常にシンプルで他のすべてで動作するため、これを入れませんでした. onCreateで:

itemNumber = 0; ...
categoryItem = (Button) findViewById(R.id.button1);
categoryItem.setText(items[itemNumber]);

もちろん、後で子が1つのオブジェクトから次のオブジェクトに進むにつれて、これが繰り返されます。

09-01 22:18:09.586: E/AndroidRuntime(9524): 致命的な例外: メイン 09-01 22:18:09.586: E/AndroidRuntime(9524): java.lang.RuntimeException: アクティビティ ComponentInfo{com を開始できません。 allababiditech.academics/com.allababiditech.academics.LevelOneActivity}: java.lang.ArrayIndexOutOfBoundsException: length=27; index=28 09-01 22:18:09.586: E/AndroidRuntime(9524): android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110) 09-01 22:18:09.586: E/AndroidRuntime(9524): android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110) 09-01 22:18:09.586: E/AndroidRuntime(9524): android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135) 09-01 22 :18:09.586: E/AndroidRuntime(9524): android.app.ActivityThread.access$700(ActivityThread.java:140) 09-01 22:18:09.586: E/AndroidRuntime(9524): E/AndroidRuntime(9524): dalvik.system.NativeStart.main(Native Method) 09-01 22:18:09.586: E/AndroidRuntime(9524): 原因: java.lang.ArrayIndexOutOfBoundsException: length=27; インデックス = 28 09-01 22:18:09.586: E/AndroidRuntime (9524): com.allababiditech.academics.LevelOneActivity.onCreate (LevelOneActivity.java:1454) 09-01 22:18:09.586: E/AndroidRuntime (9524 ): android.app.Activity.performCreate(Activity.java:5206) 09-01 22:18:09.586: E/AndroidRuntime(9524): android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094) 09- 01 22:18:09.586: E/AndroidRuntime(9524): android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074) 09-01 22:18:09.586: E/AndroidRuntime(9524): ... 11 もっと見る 原因: java.lang.ArrayIndexOutOfBoundsException: length=27; インデックス = 28 09-01 22:18:09.586: E/AndroidRuntime (9524): com.allababiditech.academics.LevelOneActivity.onCreate (LevelOneActivity.java:1454) 09-01 22:18:09.586: E/AndroidRuntime (9524 ): android.app.Activity.performCreate(Activity.java:5206) 09-01 22:18:09.586: E/AndroidRuntime(9524): android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094) 09- 01 22:18:09.586: E/AndroidRuntime(9524): android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074) 09-01 22:18:09.586: E/AndroidRuntime(9524): ... 11 もっと見る 原因: java.lang.ArrayIndexOutOfBoundsException: length=27; インデックス = 28 09-01 22:18:09.586: E/AndroidRuntime (9524): com.allababiditech.academics.LevelOneActivity.onCreate (LevelOneActivity.java:1454) 09-01 22:18:09.586: E/AndroidRuntime (9524 ): android.app.Activity.performCreate(Activity.java:5206) 09-01 22:18:09.586: E/AndroidRuntime(9524): android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094) 09- 01 22:18:09.586: E/AndroidRuntime(9524): android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074) 09-01 22:18:09.586: E/AndroidRuntime(9524): ... 11 もっと見る

4

1 に答える 1

0

28 個の項目を持つ配列の既存の最大インデックスは 27 です。これは、配列インデックスが Java (および他のほとんどのプログラミング言語) で 0 から始まるためです。1 から 28 までカウントを開始すると、例外が発生するようです。

于 2013-09-01T18:22:45.170 に答える