简体   繁体   English

Java IndexOutOfBound 异常在 Android 中使用 arraylist

[英]Java IndexOutOfBound exception Using arraylist in Android

I am new to android development.我是安卓开发的新手。 I am using a Userdefined Arraylist called Donors in this code but it gives me error.我在这段代码中使用了一个名为 Donors 的用户定义的 Arraylist,但它给了我错误。 I saw the same error posted here many time but still i am not able to find my solution.我多次看到这里发布的相同错误,但我仍然无法找到我的解决方案。 Please Help.请帮忙。 Thanks谢谢

 05-01 23:45:10.855 1756-3399/com.donateblood.blooddonation E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #2 Process: com.donateblood.blooddonation, PID: 1756 java.lang.RuntimeException: An error occured while executing doInBackground() at android.os.AsyncTask$3.done(AsyncTask.java:300) at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) at java.util.concurrent.FutureTask.setException(FutureTask.java:222) at java.util.concurrent.FutureTask.run(FutureTask.java:242) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) at java.lang.Thread.run(Thread.java:818) Caused by: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) at java.util.ArrayList.get(ArrayList.java:308) at com.donateblood.blooddonation.MainGUI.getOtherLatLong(MainGUI.java:136) at com.donateblood.blooddonation.MainGUI$dbAsync.doInBackground(MainGUI.java:89) at com.donateblood.blooddonation.MainGUI$dbAsync.doInBackground(MainGUI.java:84) at android.os.AsyncTask$2.call(AsyncTask.java:288) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) at java.lang.Thread.run(Thread.java:818) 05-01 23:45:11.525 1756-1756/com.donateblood.blooddonation E/WindowManager: android.view.WindowLeaked: Activity com.donateblood.blooddonation.MainGUI has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{28ea9195 VE.... R......D 0,0-1026,348} that was originally added here at android.view.ViewRootImpl.<init>(ViewRootImpl.java:382) at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:261) at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69) at android.app.Dialog.show(Dialog.java:298) at com.donateblood.blooddonation.MainGUI$dbAsync.onPreExecute(MainGUI.java:100) at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:587) at android.os.AsyncTask.execute(AsyncTask.java:535) at com.donateblood.blooddonation.MainGUI$1.onClick(MainGUI.java:63) at android.view.View.performClick(View.java:4785) at android.view.View$PerformClick.run(View.java:19858) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:155) at android.app.ActivityThread.main(ActivityThread.java:5696) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823) 05-01 23:45:47.083 1756-3399/com.donateblood.blooddonation D/Process: killProcess, pid=1756 05-01 23:45:47.083 1756-3399/com.donateblood.blooddonation D/Process: com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException:138 java.lang.ThreadGroup.uncaughtException:693 java.lang.ThreadGroup.uncaughtException:690
 package com.donateblood.blooddonation; import android.app.ProgressDialog; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.MenuItem; import android.view.View; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.Spinner; import android.widget.Toast; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.DBCursor; import com.mongodb.DBObject; import java.util.ArrayList; import java.util.List; import butterknife.ButterKnife; import butterknife.InjectView; /** * Created by YouCaf Iqbal on 4/6/2016. */ public class MainGUI extends AppCompatActivity { public static List<DonorPerson> Donors = new ArrayList<DonorPerson>(); @InjectView(R.id.findppl) Button _findButton; GPSTracker gps; private double latitude; private double longitude; DB db; String test=""; DBCursor cursor; DBCollection collection; Database dataobj = new Database(); ArrayList allPPLlat = new ArrayList(); ArrayList allPPLlong = new ArrayList(); ArrayList allPPLNumbers = new ArrayList(); ArrayList allPPLNames = new ArrayList(); ArrayList allPPLImages = new ArrayList(); ArrayList allPPLEmails = new ArrayList(); ArrayList SelectedPPLlat = new ArrayList(); ArrayList SelectedPPLlong = new ArrayList(); public Spinner mySpinner; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.maingui); ButterKnife.inject(this); getSupportActionBar().setDisplayHomeAsUpEnabled(true); Spinner spinner =(Spinner) findViewById(R.id.spinner); String[] list = getResources().getStringArray(R.array.blood_type); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.spinner_layout,R.id.txt,list); spinner.setAdapter(adapter); _findButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { getCurrentLatLong(); dbAsync thrd = new dbAsync(); thrd.execute(); } //distance=Distance(lablat, lablong, curlat, curlong); }); } public void getCurrentLatLong(){ gps = new GPSTracker(MainGUI.this); if (gps.canGetLocation()) { latitude = gps.getLatitude(); longitude = gps.getLongitude(); } } @Override public boolean onOptionsItemSelected(MenuItem item) { if(item.getItemId()==android.R.id.home){ finish(); } return super.onOptionsItemSelected(item); } public class dbAsync extends AsyncTask<Void,Void,Void>{ private ProgressDialog pDialog; @Override protected Void doInBackground(Void... voids) { getOtherLatLong(); return null; } @Override protected void onPreExecute() { super.onPreExecute(); pDialog = new ProgressDialog(MainGUI.this); pDialog.setMessage("Searching people nearby..."); pDialog.setIndeterminate(false); pDialog.setCancelable(true); pDialog.show(); } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); pDialog.dismiss(); Intent intent = new Intent(getApplicationContext(), PeopleList.class); startActivity(intent); // Toast.makeText(getBaseContext(), "Near by latitudes "+SelectedPPLlat, Toast.LENGTH_LONG).show(); // Toast.makeText(getBaseContext(), "Near by longitudes "+SelectedPPLlong, Toast.LENGTH_LONG).show(); } } public void getOtherLatLong() { db = dataobj.getconnection(); collection = db.getCollection("UserDetails"); cursor = collection.find(); while (cursor.hasNext()) { DBObject doc = cursor.next(); // Lats longs used in the next for Loop for calculation distances allPPLlat.add(doc.get("lat")); allPPLlong.add(doc.get("long")); // All these other arraylists are used to store object of a donor person allPPLEmails.add(doc.get("number").toString()); allPPLNames.add(doc.get("Name").toString()); allPPLImages.add(doc.get("image").toString()); allPPLEmails.add(doc.get("email").toString()); } for(int i =0;i<allPPLlat.size();i++){ double Dist= Distance((double)allPPLlat.get(i),(double)allPPLlong.get(i),latitude,longitude); Dist=Dist/1000; if(Dist<20){ Donors.add(new DonorPerson(""+allPPLNames.get(i)+"", ""+allPPLEmails.get(i)+"" ,""+allPPLNumbers.get(i)+"" ,""+allPPLImages.get(i)+"")); } } } public double Distance(double lat1, double lon1, double lat2, double lon2) { double R = 6371.0; // km double dLat = (lat2 - lat1) * Math.PI / 180.0; double dLon = (lon2 - lon1) * Math.PI / 180.0; lat1 = lat1 * Math.PI / 180.0; lat2 = lat2 * Math.PI / 180.0; double a = Math.sin(dLat / 2.0) * Math.sin(dLat / 2.0) + Math.sin(dLon / 2.0) * Math.sin(dLon / 2.0) * Math.cos(lat1) * Math.cos(lat2); double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); double d = R * c; return d * 1000; // return distance in m } }

On this part:在这部分:

for(int i =0;i<allPPLlat.size();i++){
           double Dist= Distance((double)allPPLlat.get(i),(double)allPPLlong.get(i),latitude,longitude);
            Dist=Dist/1000;
            if(Dist<20){
                Donors.add(new DonorPerson(""+allPPLNames.get(i)+"", ""+allPPLEmails.get(i)+"" ,""+allPPLNumbers.get(i)+"" ,""+allPPLImages.get(i)+""));
            }
        }

You are doing a get for the position 0 of an empty array, which does not exist and throws the error you are seeing.您正在对空数组的位置0执行get ,该数组不存在并抛出您看到的错误。 The stack trace is actually pointing you to the exact location.堆栈跟踪实际上将您指向确切的位置。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM