0

我收到一个无法解决的 ArrayIndexOutOfBoundsException。

简而言之,它是一款儿童应用程序,用于学习字母、数字和其他七种常见物体的名称。它会显示对象/字符/数字的图像,并在下方以文本形式显示名称,并在轻按对象时显示名称的相应音频。

用户可以选择英语或阿拉伯语。

除阿拉伯字母外,一切都有效,但为阿拉伯文本中字母的字符串数组抛出异常。

这是一个有效的小类别示例:

        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 个)。

如果我使用英文文本数组并向其中添加两个重复的英文字符,我会得到相同的异常,只是现在长度和索引又相差了两个。

如果我使用英语或阿拉伯语中的任何其他类别的文​​本数组作为替代,只要数组中有 26 个或更少的文本项,阿拉伯图像和音频就可以用于文本项的数量。(“字母”是所有类别中最长的数组。)

我认为阿拉伯字母多于英文字母并不重要,因为一切都基于字符串数组中的项目数,因此 items.length 将是 28 而不是 26。

我整天都在用头撞显示器,我希望有人不介意偷看并指出我没有看到的非常简单、明显的错误。非常感谢。

编辑:对不起,没有把它放进去,因为它很简单并且适用于其他一切。在 onCreate 中:

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

然后当然稍后随着孩子从一个对象前进到下一个对象,这会迭代。

09-01 22:18:09.586: E/AndroidRuntime(9524): 致命异常: main 09-01 22:18:09.586: E/AndroidRuntime(9524): java.lang.RuntimeException: 无法启动活动 ComponentInfo{com. allababiditech.academics/com.allababiditech.academics.LevelOneActivity}:java.lang.ArrayIndexOutOfBoundsException:长度=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): at dalvik.system.NativeStart.main(Native Method) 09-01 22:18:09.586: E/AndroidRuntime(9524): Caused by: java.lang.ArrayIndexOutOfBoundsException: length=27; index=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; index=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; index=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 回答