[英]java.lang.IndexOutOfBoundsException: Invalid index 5, size is 5
[英]java.lang.IndexOutOfBoundsException: Invalid index 2, size is 2 in Arraylist?
我有一個偵聽器,當我單擊日期時,它將搜索arraylist並獲取單擊的日期,然后當我更改月份時,將刪除日期,然后在當前月份中添加日期。
public void onSelectDate(Date date, View view) {
JSONObject jsonObj = new JSONObject(jsonStr);
JsonArray datesIn = jsonObj.getJSONArray(TAG_SCHEDULE);
for (int i = 0; i < datesIn.length(); i++) {
JSONObject c = datesIn.getJSONObject(i);
String dateD = c.getString(TAG_DATED);
String statusD = c.getString(TAG_STATUS);
HashMap<String, String> contact = new HashMap<String, String>();
contact.put("Tag_dated", dateD);
contact.put("Tag_status", statusD);
contactList.add(contact);
Date s = formatter.parse(dateD);
ArrayList<HashMap<String, String>> contactList= new ArrayList<HashMap<String,String>>();;
if(formatter.format(date).equals(contactList.get(0).get(TAG_DATED))){
if(contactList.get(0).get(TAG_STATUS).equals("Occupied")){
Toast.makeText(getApplicationContext(),"S",Toast.LENGTH_SHORT).show();
}else if(contactList.get(0).get(TAG_STATUS).equals("Reserved"))
Toast.makeText(getApplicationContext(),"R",Toast.LENGTH_SHORT).show();
}else if(formatter.format(date).equals(contactList.get(1).get(TAG_DATED))){
if(contactList.get(1).get(TAG_STATUS).equals("Occupied")){
Toast.makeText(getApplicationContext(),"S",Toast.LENGTH_SHORT).show();
}else if(contactList.get(1).get(TAG_STATUS).equals("Reserved")){
Toast.makeText(getApplicationContext(),"R",Toast.LENGTH_SHORT).show();
}
}else if(formatter.format(date).equals(contactList.get(2).get(TAG_DATED))){
if(contactList.get(2).get(TAG_STATUS).equals("Occupied")){
Toast.makeText(getApplicationContext(),"S",Toast.LENGTH_SHORT).show();
}else if(contactList.get(2).get(TAG_STATUS).equals("Reserved")){
Toast.makeText(getApplicationContext(),"R",Toast.LENGTH_SHORT).show();
}
}else if(formatter.format(date).equals(contactList.get(3).get(TAG_DATED))){
if(contactList.get(3).get(TAG_STATUS).equals("Occupied")){
Toast.makeText(getApplicationContext(),"S",Toast.LENGTH_SHORT).show();
}else if(contactList.get(3).get(TAG_STATUS).equals("Reserved")){
Toast.makeText(getApplicationContext(),"R",Toast.LENGTH_SHORT).show();
}
}else if(formatter.format(date).equals(contactList.get(4).get(TAG_DATED))){
if(contactList.get(4).get(TAG_STATUS).equals("Occupied")){
Toast.makeText(getApplicationContext(),"S",Toast.LENGTH_SHORT).show();
}else if(contactList.get(4).get(TAG_STATUS).equals("Reserved")){
Toast.makeText(getApplicationContext(),"R",Toast.LENGTH_SHORT).show();
}
}else if(formatter.format(date).equals(contactList.get(5).get(TAG_DATED))){
if(contactList.get(5).get(TAG_STATUS).equals("Occupied")){
Toast.makeText(getApplicationContext(),"S",Toast.LENGTH_SHORT).show();
}else if(contactList.get(5).get(TAG_STATUS).equals("Reserved")){
Toast.makeText(getApplicationContext(),"R",Toast.LENGTH_SHORT).show();
}
}else{
Toast.makeText(getApplicationContext(),"NP",Toast.LENGTH_SHORT).show();
}
}
我的問題是當我更改月份然后單擊以獲取錯誤日期。
public void onChangeMonth(int month, int year) {
contactList.clear();
HashMap<String, String> contact = new HashMap<String, String>();
contact.put("Tag_dated", dateD);
contact.put("Tag_status", statusD);
contactList.add(contact);
}
Logcat錯誤:
您正在創建一個名為contactList
的新ArrayList
,並向其中添加一個元素。 那么您正在嘗試從中檢索幾個元素!
錯誤是海峽向前,大小是兩個。 索引從0開始,因此可用索引為0和1而不是1和2。您的循環可能需要大小-1。
而不是硬編碼您的語句,例如:if(formatter.format(date).equals(contactList.get(0).get(TAG_DATED))){
嘗試以循環方式進行
public void updateToast(Date date, ArrayList<HashMap<String, String>> contactList) {
String formattedDate = formatter.format(date);
for (int i = 0; i < contactList.size(); i++)
{
if (formattedDate.equals(contactList.get(i).get(TAG_DATED)))
{
if(contactList.get(i).get(TAG_STATUS).equals("Occupied"))
{
Toast.makeText(getApplicationContext(),"S",Toast.LENGTH_SHORT).show();
return;
} else if(contactList.get(i).get(TAG_STATUS).equals("Reserved"))
{
Toast.makeText(getApplicationContext(),"R",Toast.LENGTH_SHORT).show();
return;
}
}
}
// If here then its not found in any lists throw up your other text.
Toast.makeText(getApplicationContext(),"NP",Toast.LENGTH_SHORT).show();
}
其中一些可能是由於它在這里的閑置完成而有些不足。
在您的代碼onSelectDate中,您說的是:
contactList.add(contact);
它將僅將Hashmap添加到列表一次,因此您可以在Arraylist上使用contactList.get(0)。 但是向前說
contactList.get(1);//even two
因此它沒有超越第一的元素,因此會引發異常。
讓我們重構一下代碼,擺脫這種丑陋的,不安全的if / else恐怖,並將其更改為美觀的循環
boolean found = false;
String formattedDate = formatter.format(date);
for (int i = 0; i < contactList.size(); i++) {
if (formattedDate.equals(contactList.get(i).get(TAG_DATED))) {
if (contactList.get(i).get(TAG_STATUS).equals("Occupied")) {
Toast.makeText(getApplicationContext(), "S",
Toast.LENGTH_SHORT).show();
} else if (contactList.get(1).get(TAG_STATUS)
.equals("Reserved")) {
Toast.makeText(getApplicationContext(), "R",
Toast.LENGTH_SHORT).show();
}
found = true;
break;
}
}
if (!found) {
Toast.makeText(getApplicationContext(), "NP",
Toast.LENGTH_SHORT).show();
}
此代碼應該做與您完全相同的事情,但是不應該給您ArrayIndexOutOfBoundsException
異常
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.