2011-12-27 2 views
0

세부 항목에서 항목 목록으로 돌아갈 때 안드로이드 앱에서 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]); 

여기서 위치는 올바른 값을 나타내지 만 오류는 계속 발생합니다. 배열 크기가 0이거나이 오류가 올 것이다 7 인덱스에 액세스하려고하면 배열 크기가 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

이 오류를 throw하는 코드를 게시 할 수 있습니까? 도움이 될 수도 있습니다. –

답변

2

배열을 분석하고 실행간에 변경되지 않도록 코드 줄을 추가하는 것이 좋습니다. 액티비티간에 바운싱을하면 오브젝트가 어떻게 든 손실되거나 변경 될 수 있습니다. 우선은 (그것이 배열의 어떤 유형? 기입) 그 지에스 계정을 선택하기 전에 통화 후

ListArray<?> = gs.getAccounts(); 

를 추가하기 전에 null가 아닌 보험. 어떤 배열을 반환하는지 또는 null 포인터를 반환하는지 확인하십시오. 그게 잘하면 당신에게 좀 더 답변을 얻을 것이다

1

배열이 발생합니다 여기

는 코드입니다.

내가 listview 처음으로 배열을 채우고 있다고 생각 하나. 그래서 그 배열을 작성하기 전에 해당 배열을 지우고 값을 채우십시오.

+0

하지만 처음에는 완벽하게 작동하지만 다시 돌아와 다시하지는 ​​않습니다. 그리고 배열의 내용을 지우면 같은 오류가 발생합니다. – user790514

0

배열 색인 바운드가 발생합니다 배열 크기보다 색인이 큰 요소에 액세스 할 때주의해야합니다.

+0

Ranjit Mishra -이 경우 처음으로 실행 되나요? 앞에서 말했듯이, 처음에는 실행되지만 다시 돌아가서 어떤 연락처에 액세스하려고하면 오류가 표시됩니다. – user790514

+0

나는 더 나은 제안을 할 수있다. 만약 당신이 logcat을 게시 할 것이다. –

+0

로그 고양이가 질문에 게시되었습니다. – user790514

관련 문제