ArrayIndexOutOfBoundsException android

问题描述:

我在我的Android应用程序中有ArrayIndexOutOfBoundsException,当我从一个细节项返回到项目列表。它完美,当我点击列表中的任何项目以查看其详细信息,但是当我从细节回去,任何选择的项目给出了这样的错误:在这一点上ArrayIndexOutOfBoundsException android

12-27 12:40:14.033: WARN/System.err(681): java.lang.ArrayIndexOutOfBoundsException 
12-27 12:40:14.083: WARN/System.err(681):  at com.salesforce.android.restsample.ContactListView$1.onItemClick(ContactListView.java:74) 
12-27 12:40:14.083: WARN/System.err(681):  at android.widget.AdapterView.performItemClick(AdapterView.java:284) 
12-27 12:40:14.134: WARN/System.err(681):  at android.widget.ListView.performItemClick(ListView.java:3513) 
12-27 12:40:14.134: WARN/System.err(681):  at android.widget.AbsListView$PerformClick.run(AbsListView.java:1812) 
12-27 12:40:14.153: WARN/System.err(681):  at android.os.Handler.handleCallback(Handler.java:587) 
12-27 12:40:14.183: WARN/System.err(681):  at android.os.Handler.dispatchMessage(Handler.java:92) 
12-27 12:40:14.183: WARN/System.err(681):  at android.os.Looper.loop(Looper.java:123) 
12-27 12:40:14.193: WARN/System.err(681):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
12-27 12:40:14.193: WARN/System.err(681):  at java.lang.reflect.Method.invokeNative(Native Method) 
12-27 12:40:14.213: WARN/System.err(681):  at java.lang.reflect.Method.invoke(Method.java:507) 
12-27 12:40:14.213: WARN/System.err(681):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
12-27 12:40:14.223: WARN/System.err(681):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
12-27 12:40:14.323: WARN/System.err(681):  at dalvik.system.NativeStart.main(Native Method) 

我的代码中出现的错误:

 gs.setSelectedAccount(gs.getAccounts()[position]); 

这里的位置给出了正确的值,但错误仍然存​​在。

这里是代码:如果数组大小是零,或者如果数组大小为6,如果您尝试访问第七指数这个错误会发生

public class ContactListView extends ListActivity { 
@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 

    GlobalState gs = (GlobalState) getApplication(); 

    setContentView(R.layout.newlist); 

    getAccountData(); 
    setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, gs.getAccountNames())); 

    ListView lv = getListView(); 
    lv.setTextFilterEnabled(true); 

    final EditText et = (EditText) findViewById(R.id.editText); 

    lv.setOnItemClickListener(new OnItemClickListener() { 
    public void onItemClick(AdapterView<?> parent, View view, 
     int position, long id) { 
     GlobalState gs = (GlobalState) getApplication(); 
     try{ 
     gs.setSelectedAccount(gs.getAccounts()[position]); 
     }catch(IndexOutOfBoundsException e) 
     { 
      e.printStackTrace(); 
     } 
     JSONObject acct = gs.getSelectedAccount(); 
     String str = null; 
     try { 
      str = acct.getString("AccountId")!= "null"?acct.getString("AccountId"):""; 
     } catch (JSONException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 
      launchAccountDetail(str); 
     // When clicked, show a toast with the TextView text 
     Toast.makeText(getApplicationContext(), ((TextView) view).getText(), 
      Toast.LENGTH_SHORT).show(); 
    } 
    }); 


    final Button btnGo = (Button) findViewById(R.id.btnGo); 
    Button btnSearch = (Button) findViewById(R.id.btnSearch); 
    btnSearch.setOnClickListener(new OnClickListener(){ 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     et.setVisibility(View.VISIBLE); 
     btnGo.setVisibility(View.VISIBLE); 
    } 
    }); 

    btnGo.setOnClickListener(new OnClickListener(){ 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      String txt = et.getText().toString(); 
      launchPartularAccount(txt); 
//   getAccountData(txt); 
//    setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, gs.getAccountNames())); 
     } 
     }); 

    Button newBtn = (Button)findViewById(R.id.btnFromDate); 
    newBtn.setOnClickListener(new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     GlobalState gs = (GlobalState) getApplication(); 
     gs.setSelectedAccount(gs.getAccounts()[0]); 
     launchAddAccount(); 
    } 

    }); 
} 

protected void launchAddAccount() { 
    Intent i = new Intent(this, AddAccount.class); 
    startActivity(i); 
} 
protected void launchAccountDetail(String str) { 
    Intent i = new Intent(this, ContactDetail.class); 
    i.putExtra("Id", str); 
    startActivity(i); 
} 

private void getAccountData() { 
    GlobalState globalState = (GlobalState) getApplication(); 

    OAuthTokens myTokens = globalState.getAccessTokens(); 

    DefaultHttpClient client = new DefaultHttpClient(); 
    String url = myTokens.get_instance_url() + "/services/data/v20.0/query/?q="; 
    String soqlQuery = "Select Id, Name, Birthdate, AssistantName, AssistantPhone, Department, Email, LastActivityDate, AccountId, Account.Name, Account.BillingState From Contact limit 20"; 
    try 
    { 
     url += URLEncoder.encode(soqlQuery, "UTF-8"); 
    } 
    catch(UnsupportedEncodingException e){} 

    HttpGet getRequest = new HttpGet(url); 

    getRequest.addHeader("Authorization", "OAuth " + myTokens.get_access_token()); 

    try { 
     HttpResponse response = client.execute(getRequest); 

     String result = EntityUtils.toString(response.getEntity()); 

     JSONObject object = (JSONObject) new JSONTokener(result).nextValue(); 

     JSONArray records = object.getJSONArray("records"); 

     globalState.setAccountNames(new String[records.length()]); 
     globalState.setAccounts(new JSONObject[records.length()]); 

     for (int i=0;i<records.length();i++) { 
      JSONObject record = (JSONObject) records.get(i); 
      String accountName = record.getString("Name"); 
      globalState.getAccountNames()[i] = accountName; 
      globalState.getAccounts()[i] = record; 
     } 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    catch (JSONException e) { 
     e.printStackTrace(); 
    } 

} 
private void launchPartularAccount(String txt) { 
    // TODO Auto-generated method stub 
    Intent i = new Intent(this, ParticularAccount.class); 
    i.putExtra("id", txt); 
    startActivity(i); 
} 
} 
+0

你可以发布你的代码引发这个错误?这可能会有所帮助。 – 2011-12-27 08:00:52

我建议添加一行代码,以便您可以分析数组并确保它在运行之间不会发生变化。这可能是因为当你在两次活动之间反弹时,对象不知何故被丢失或改变。首先,确保GS不为空之前您的通话,然后添加

ListArray<?> = gs.getAccounts(); 

选择帐户之前(填?不管是什么类型的数组它是)。看看它返回的是什么数组,或者它是否可能返回一个空指针。这将有希望让你更多的答案

阵列外边界异常。

做一件事我认为你是第一次在listview中填充数组。所以在填充该数组之前尝试清除该数组然后填充值。

+0

但它第一次完美运作,但不是当我回去再做一次。清除数组也不起作用,给出了相同的错误。 – user790514 2011-12-27 08:10:15

当您正在访问索引大于您的数组大小的元素时,数组索引超出了限制...因此请小心。

+0

Ranjit Mishra - 如果是这样的话,它会在第一次运行吗?因为正如我前面所说,它第一次运行,但是当我回去尝试访问任何联系人时,它就会显示该错误。 – user790514 2011-12-27 08:24:20

+0

我可以有更好的建议,如果你会发布logcat。 – 2011-12-27 08:26:35

+0

日志猫在问题中发布 – user790514 2011-12-27 08:40:37