簡體   English   中英

如何刪除java.lang.IndexOutOfBoundsException?

[英]How to remove java.lang.IndexOutOfBoundsException?

我是android應用程序開發的新手,正在開發android應用程序。 我的應用程序將數組列表用於復選框和未決意圖。 但是在執行時,它在logcat窗口中給出以下錯誤:

java.lang.RuntimeException: Unable to start activity ComponentInfo java.lang.IndexOutOfBoundsException: Invalid index 1, size is 0

我的部分代碼如下:

public class Labs extends Activity {


    ArrayList <CheckBox> l= new ArrayList <CheckBox>(60);


    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_labs);
    addenable();


    l.add(1,(CheckBox)findViewById(R.id.checkBox101));
    l.add(2,(CheckBox)findViewById(R.id.checkBox102));
    l.add(3,(CheckBox)findViewById(R.id.checkBox103));
    l.add(4,(CheckBox)findViewById(R.id.checkBox104));
    l.add(5,(CheckBox)findViewById(R.id.checkBox105));
    l.add(6,(CheckBox)findViewById(R.id.checkBox106));
    l.add(7,(CheckBox)findViewById(R.id.checkBox107));
    l.add(8,(CheckBox)findViewById(R.id.checkBox108));
    l.add(9,(CheckBox)findViewById(R.id.checkBox109));
    l.add(10,(CheckBox)findViewById(R.id.checkBox110));
    l.add(11,(CheckBox)findViewById(R.id.checkBox111));
    l.add(12,(CheckBox)findViewById(R.id.checkBox112));
    l.add(13,(CheckBox)findViewById(R.id.checkBox113));
    l.add(14,(CheckBox)findViewById(R.id.checkBox114));
    l.add(15,(CheckBox)findViewById(R.id.checkBox115));
    l.add(16,(CheckBox)findViewById(R.id.checkBox116));
    l.add(17,(CheckBox)findViewById(R.id.checkBox117));
    l.add(18,(CheckBox)findViewById(R.id.checkBox118));
    l.add(19,(CheckBox)findViewById(R.id.checkBox119));
    l.add(20,(CheckBox)findViewById(R.id.checkBox120));
    l.add(21,(CheckBox)findViewById(R.id.checkBox121));
    l.add(22,(CheckBox)findViewById(R.id.checkBox122));
    l.add(23,(CheckBox)findViewById(R.id.checkBox123));
    l.add(24,(CheckBox)findViewById(R.id.checkBox124));
    l.add(25,(CheckBox)findViewById(R.id.checkBox125));
    l.add(26,(CheckBox)findViewById(R.id.checkBox126));
    l.add(27,(CheckBox)findViewById(R.id.checkBox127));
    l.add(28,(CheckBox)findViewById(R.id.checkBox128));
    l.add(29,(CheckBox)findViewById(R.id.checkBox129));
    l.add(30,(CheckBox)findViewById(R.id.checkBox130));
    l.add(31,(CheckBox)findViewById(R.id.checkBox131));
    l.add(32,(CheckBox)findViewById(R.id.checkBox132));
    l.add(33,(CheckBox)findViewById(R.id.checkBox133));
    l.add(34,(CheckBox)findViewById(R.id.checkBox134));
    l.add(35,(CheckBox)findViewById(R.id.checkBox135));
    l.add(36,(CheckBox)findViewById(R.id.checkBox136));
    l.add(37,(CheckBox)findViewById(R.id.checkBox137));
    l.add(38,(CheckBox)findViewById(R.id.checkBox138));
    l.add(39,(CheckBox)findViewById(R.id.checkBox139));
    l.add(40,(CheckBox)findViewById(R.id.checkBox140));
    l.add(41,(CheckBox)findViewById(R.id.checkBox141));
    l.add(42,(CheckBox)findViewById(R.id.checkBox142));
    l.add(43,(CheckBox)findViewById(R.id.checkBox143));
    l.add(44,(CheckBox)findViewById(R.id.checkBox144));
    l.add(45,(CheckBox)findViewById(R.id.checkBox145));
    l.add(46,(CheckBox)findViewById(R.id.checkBox146));
    l.add(47,(CheckBox)findViewById(R.id.checkBox147));
    l.add(48,(CheckBox)findViewById(R.id.checkBox148));
    l.add(49,(CheckBox)findViewById(R.id.checkBox149));
    l.add(50,(CheckBox)findViewById(R.id.checkBox150));
    l.add(51,(CheckBox)findViewById(R.id.checkBox151));
    l.add(52,(CheckBox)findViewById(R.id.checkBox152));
    l.add(53,(CheckBox)findViewById(R.id.checkBox153));
    l.add(54,(CheckBox)findViewById(R.id.checkBox154));
    l.add(55,(CheckBox)findViewById(R.id.checkBox155));
    l.add(56,(CheckBox)findViewById(R.id.checkBox156));
    l.add(57,(CheckBox)findViewById(R.id.checkBox157));
    l.add(58,(CheckBox)findViewById(R.id.checkBox158));
    l.add(59,(CheckBox)findViewById(R.id.checkBox159));
    l.add(60,(CheckBox)findViewById(R.id.checkBox160));

        }





    //Intents
    Intent setVibration = new Intent();
    setVibration.setClass(this, AlarmReciever.class);

    Intent setNormal = new Intent();
    setNormal.setClass(this, RingerMode.class);


    //PENDING INTENTS

    ArrayList <PendingIntent> Lab_V= new ArrayList <PendingIntent>(60);
    ArrayList <PendingIntent> Lab_N= new ArrayList <PendingIntent>(60);

    for(int i=0; i<60; i++)
    {
        Lab_V.add(i+1, PendingIntent.getBroadcast(this, i+1, setVibration,
                PendingIntent.FLAG_UPDATE_CURRENT));
        Lab_N.add(i+1, PendingIntent.getBroadcast(this, i+1, setNormal,
                PendingIntent.FLAG_UPDATE_CURRENT));
    }


    // create the object
    AlarmManager mAlarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);


    for(int i=0; i<60; i++)
    {

        if(l.get(i+1).isChecked()){

             mAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP, L[i+1].getTimeInMillis(), 7*24*60*60*1000, Lab_V.get(i+1));
             mAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP, L[i+1].getTimeInMillis()+50*60*1000, 7*24*60*60*1000, Lab_N.get(i+1));


        }
    }

    }

請幫助我解決此錯誤。 這將是巨大的幫助。 提前致謝。

添加如下元素:

l.add((CheckBox)findViewById(R.id.checkBox101));
l.add((CheckBox)findViewById(R.id.checkBox102));
l.add((CheckBox)findViewById(R.id.checkBox103));
[..]

要么

l.add(0, (CheckBox)findViewById(R.id.checkBox101));
l.add(1, (CheckBox)findViewById(R.id.checkBox102));
l.add(2, (CheckBox)findViewById(R.id.checkBox103));
[..]

或最乏味的方式

for (int i = 101; i <= 160; i++) {
   String viewId = "checkBox" + i;
   l.add((CheckBox) findViewById(getResources().getIdentifier(viewId, "id", getPackageName())));
}

這是因為Java中的索引以0開頭。 因此,一開始,當列表為空時,當您嘗試使用以下命令在索引1 add (在這種情況下,其工作方式類似於插入)

l.add(1,(CheckBox)findViewById(R.id.checkBox101));

您將獲得IndexOutOfBoundsException ,因為沒有索引1 ,列表為空,並且只有索引0可以插入內容,因為Java中的列表索引以0開頭。

然后,您需要更改其他代碼以免做不必要的i+1例如這里

  for(int i=0; i<60; i++)
    {
        if(l.get(i+1).isChecked()){
            [...]
        }
    }

現在應該是:

  for(int i=0; i<60; i++)
    {
        if(l.get(i).isChecked()){
            [...]
        }
    }

由於您沒有提供完整的源代碼,也沒有發布堆棧跟蹤,因此此答案是基於假設的。

盡管您以60的容量初始化ArrayList l ,但其大小仍為0。因此,如docs中所述,無法在索引1處添加元素。

列表索引始終以0開頭,而不是以1開頭。如果確實需要從1開始計數,則可以先添加一個空元素。

您必須從索引0開始而不是從索引1開始。這就是Java給出錯誤消息的原因,因為索引0從未被初始化,因此索引1不存在。

    l.add(0,(CheckBox)findViewById(R.id.checkBox101));
    l.add(1,(CheckBox)findViewById(R.id.checkBox102));
    .
    .
    .
    l.add(58,(CheckBox)findViewById(R.id.checkBox101));
    l.add(59,(CheckBox)findViewById(R.id.checkBox102));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM