Android java.lang.IndexOutOfBoundsException错误

时间:2019-07-25 03:26:09

标签: android arrays

在android系统中,我向所有按钮添加了onClickListener。

代码:

        ArrayList<ImageButton> alfabebutonlar = new ArrayList<ImageButton>();

        alfabebutonlar.add((ImageButton)findViewById(R.id.harfab));
        alfabebutonlar.add((ImageButton)findViewById(R.id.harfbb));
        alfabebutonlar.add((ImageButton)findViewById(R.id.harfcb));
        alfabebutonlar.add((ImageButton)findViewById(R.id.harfccb));
        alfabebutonlar.add((ImageButton)findViewById(R.id.harfdb));
        alfabebutonlar.add((ImageButton)findViewById(R.id.harfeb));
        alfabebutonlar.add((ImageButton)findViewById(R.id.harffb));
        alfabebutonlar.add((ImageButton)findViewById(R.id.harfgb));
        alfabebutonlar.add((ImageButton)findViewById(R.id.harfggb));
        alfabebutonlar.add((ImageButton)findViewById(R.id.harfhb));
        alfabebutonlar.add((ImageButton)findViewById(R.id.harfib));
        alfabebutonlar.add((ImageButton)findViewById(R.id.harfiib));
        alfabebutonlar.add((ImageButton)findViewById(R.id.harfjb));
        alfabebutonlar.add((ImageButton)findViewById(R.id.harfkb));
        alfabebutonlar.add((ImageButton)findViewById(R.id.harflb));
        alfabebutonlar.add((ImageButton)findViewById(R.id.harfmb));
        alfabebutonlar.add((ImageButton)findViewById(R.id.harfnb));
        alfabebutonlar.add((ImageButton)findViewById(R.id.harfob));
        alfabebutonlar.add((ImageButton)findViewById(R.id.harfoob));
        alfabebutonlar.add((ImageButton)findViewById(R.id.harfpb));
        alfabebutonlar.add((ImageButton)findViewById(R.id.harfrb));
        alfabebutonlar.add((ImageButton)findViewById(R.id.harfsb));
        alfabebutonlar.add((ImageButton)findViewById(R.id.harfssb));
        alfabebutonlar.add((ImageButton)findViewById(R.id.harftb));
        alfabebutonlar.add((ImageButton)findViewById(R.id.harfub));
        alfabebutonlar.add((ImageButton)findViewById(R.id.harfuub));
        alfabebutonlar.add((ImageButton)findViewById(R.id.harfvb));
        alfabebutonlar.add((ImageButton)findViewById(R.id.harfyb));
        alfabebutonlar.add((ImageButton)findViewById(R.id.harfzb));

        ArrayList<String> alfabeharfler = new ArrayList<String>();

        alfabeharfler.add("A");
        alfabeharfler.add("B");
        alfabeharfler.add("C");
        alfabeharfler.add("Ç");
        alfabeharfler.add("D");
        alfabeharfler.add("E");
        alfabeharfler.add("F");
        alfabeharfler.add("G");
        alfabeharfler.add("Ğ");
        alfabeharfler.add("H");
        alfabeharfler.add("İ");
        alfabeharfler.add("I");
        alfabeharfler.add("J");
        alfabeharfler.add("K");
        alfabeharfler.add("L");
        alfabeharfler.add("M");
        alfabeharfler.add("N");
        alfabeharfler.add("O");
        alfabeharfler.add("Ö");
        alfabeharfler.add("P");
        alfabeharfler.add("R");
        alfabeharfler.add("S");
        alfabeharfler.add("Ş");
        alfabeharfler.add("T");
        alfabeharfler.add("U");
        alfabeharfler.add("Ü");
        alfabeharfler.add("V");
        alfabeharfler.add("Y");
        alfabeharfler.add("Z");

        for(i = 0; i < alfabebutonlar.size(); i++){

            alfabebutonlar.get(i).setOnClickListener ( new View.OnClickListener () {
                public void onClick(View alfabebutonv){

                    startActivity(getIntent().putExtra("harf", alfabeharfler.get(i)));

                }
            });

        }

但是当我单击按钮B时,出现此错误(日志):

java.lang.IndexOutOfBoundsException:无效的索引29,大小为29

日志:

java.lang.IndexOutOfBoundsException: Invalid index 29, size is 29

E/AndroidRuntime( 4367):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)

E/AndroidRuntime( 4367):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)

E/AndroidRuntime( 4367):    at android.app.ActivityThread.access$800(ActivityThread.java:151)

E/AndroidRuntime( 4367):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)

E/AndroidRuntime( 4367):    at android.os.Handler.dispatchMessage(Handler.java:102)

E/AndroidRuntime( 4367):    at android.os.Looper.loop(Looper.java:135)

E/AndroidRuntime( 4367):    at android.app.ActivityThread.main(ActivityThread.java:5254)

E/AndroidRuntime( 4367):    at java.lang.reflect.Method.invoke(Native Method)

E/AndroidRuntime( 4367):    at java.lang.reflect.Method.invoke(Method.java:372)

E/AndroidRuntime( 4367):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)

E/AndroidRuntime( 4367):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

E/AndroidRuntime( 4367): Caused by: java.lang.IndexOutOfBoundsException: Invalid index 29, size is 29

E/AndroidRuntime( 4367):    at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)

E/AndroidRuntime( 4367):    at java.util.ArrayList.get(ArrayList.java:308)

E/AndroidRuntime( 4367):    at com.example.xxx.xxx.alfabe.onCreate(alfabe.java:241)

E/AndroidRuntime( 4367):    at android.app.Activity.performCreate(Activity.java:5990)

E/AndroidRuntime( 4367):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)

E/AndroidRuntime( 4367):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)

E/AndroidRuntime( 4367):    ... 10 more

我将onClickListener添加到for循环中的所有按钮以保存代码。我想我出错了,因为在for循环中。

编辑:

我在循环中添加了这一行:final int index = i;我写索​​引给我。问题解决了。

希望您能理解

5 个答案:

答案 0 :(得分:0)

只需确保两个数组(alfabeharfler和alfabebutonlar)且具有相同数量的元素。或者更好的方法是,如果两个数组都需要匹配大小和位置,请改用Pair对象...

ArrayList<Pair<String, ImageButton>> list = new ArrayList<Pair<String, ImageButton>>();
list.add(new Pair("A", imageButton));

要访问特定项目...

list.get(i).first; //The letter/string
list.get(i).second; //The button

答案 1 :(得分:0)

在您的OnClick中执行此操作:

            //ButtonView arraylist and data arraylist size should be same....
            public void onClick(View alfabebutonv){
                 final int index = i;
                 // Ith position of buttonview should be less than the data arraylist size
                 // Add below check. i < alfabeharfler.size()
                 if( alfabeharfler != null && i < alfabeharfler.size()) { 
                    startActivity(getIntent().putExtra("harf", alfabeharfler.get(index)));
                 }

            }
        });

    }

答案 2 :(得分:0)

尝试一下:

for(i = 0; i < alfabebutonlar.size(); i++){
            String value = alfabeharfler.get(i);

            alfabebutonlar.get(i).setOnClickListener ( new View.OnClickListener () {
                public void onClick(View alfabebutonv){

                    startActivity(getIntent().putExtra("harf", value));
                }
            });

        }

答案 3 :(得分:0)

在您的方法onClick()中,它引用了您的“ i”变量,其最后一个值为29,这是它在循环中中断的时间,因此当您调用 alfabeharfler.get(i),它在您所有的调用中都使用值29,而不仅仅是在您单击按钮B时,因此,您得到了“ IndexOutOfBoundsException”异常。

尝试在循环中声明一个新的最终变量,然后在onClick方法中使用该变量,类似这样的事情(我没有尝试过此代码,但它应该可以工作):

for(i = 0; i < alfabebutonlar.size(); i++){
    final int index = i;
    alfabebutonlar.get(index).setOnClickListener ( new View.OnClickListener () {
        public void onClick(View alfabebutonv){

            startActivity(getIntent().putExtra("harf", alfabeharfler.get(index)));

        }
    });

}

希望这会有所帮助。

答案 4 :(得分:0)

请勿在侦听器内部访问i。当for循环运行时,i递增到29(28个元素)并退出。这时不执行侦听器。当您单击按钮时,将使用值29来访问i,因此将显示错误。在for循环外的按钮和标签之间创建最终映射,并从侦听器中获取它,以检索和使用标签值。