Class 应用程序类中的Android ArrayList

Class 应用程序类中的Android ArrayList,class,arraylist,android,Class,Arraylist,Android,我试图在应用程序类上传递ArrayLists,但在填充这些列表时,即使列表已初始化,我也会得到nullpointerexception。我的申请类别是: public class appCyberesa extends Application{ private ArrayList<Marchand> HProviders ;//= new ArrayList<Marchand>(); private ArrayList<CarAgency>

我试图在
应用程序
类上传递
ArrayList
s,但在填充这些列表时,即使列表已初始化,我也会得到nullpointerexception。我的申请类别是:

public class appCyberesa extends Application{

    private ArrayList<Marchand> HProviders ;//= new ArrayList<Marchand>();
    private ArrayList<CarAgency> CProviders ;//= new ArrayList<CarAgency>();
    private ArrayList<Agency> Agencies ;//= new ArrayList<Agency>();
    public GeoPoint Tunisie = new GeoPoint(microdegrees(36.80023),microdegrees(10.186073));
    private GeoPoint myLoc;

    @Override
    public void onCreate() {



    }

    private static int microdegrees(double value){
        return (int)(value*1000000);
    }

    public void setMyLoc(GeoPoint myLoc) {
        this.myLoc = myLoc;
    }

    public GeoPoint getMyLoc() {
        return myLoc;
    }

    public void setHProviders(ArrayList<Marchand> hProviders) {
        HProviders = new ArrayList<Marchand>();
        HProviders.addAll(hProviders);
    }

    public ArrayList<Marchand> getHProviders() {
        return HProviders;
    }

    public void setCProviders(ArrayList<CarAgency> cProviders) {
        CProviders = new ArrayList<CarAgency>();
        CProviders.addAll(cProviders);
    }

    public ArrayList<CarAgency> getCProviders() {
        return CProviders;
    }

    public void setAgencies(ArrayList<Agency> agencies) {
        Agencies = new ArrayList<Agency>();
        Agencies.addAll(agencies);
    }

    public ArrayList<Agency> getAgencies() {
        return Agencies;
    }
}
这是stacktrace:

09-15 13:59:19.284: ERROR/AndroidRuntime(761): java.lang.RuntimeException: An error occured while executing doInBackground()
09-15 13:59:19.284: ERROR/AndroidRuntime(761):     at android.os.AsyncTask$3.done(AsyncTask.java:200)
09-15 13:59:19.284: ERROR/AndroidRuntime(761):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
09-15 13:59:19.284: ERROR/AndroidRuntime(761):     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
09-15 13:59:19.284: ERROR/AndroidRuntime(761):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
09-15 13:59:19.284: ERROR/AndroidRuntime(761):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
09-15 13:59:19.284: ERROR/AndroidRuntime(761):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
09-15 13:59:19.284: ERROR/AndroidRuntime(761):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
09-15 13:59:19.284: ERROR/AndroidRuntime(761):     at java.lang.Thread.run(Thread.java:1096)
09-15 13:59:19.284: ERROR/AndroidRuntime(761): Caused by: java.lang.NullPointerException
09-15 13:59:19.284: ERROR/AndroidRuntime(761):     at com.cyberesa.info.Splash$ProgressTask.doInBackground(Splash.java:70)
09-15 13:59:19.284: ERROR/AndroidRuntime(761):     at com.cyberesa.info.Splash$ProgressTask.doInBackground(Splash.java:1)
09-15 13:59:19.284: ERROR/AndroidRuntime(761):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
09-15 13:59:19.284: ERROR/AndroidRuntime(761):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
09-15 13:59:19.284: ERROR/AndroidRuntime(761):     ... 4 more
ligne(Splash.java:70)是:
myApp.setHProviders(Marchands)

@Peter:Hole splash.java:

package com.cyberesa.info;


import java.util.ArrayList;

import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;

public class Splash extends Activity {
    ArrayList<Marchand>Marchands = new ArrayList<Marchand>();
    ArrayList<CarAgency> CarRenters = new ArrayList<CarAgency>();
    ArrayList<Agency> Agencies = new ArrayList<Agency>();
    appCyberesa myApp = ((appCyberesa)this.getApplication());
    MyProgressDialog dialog;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.splashscreen);

        dialog = MyProgressDialog.show(this, null, null);
        new ProgressTask(Splash.this).execute();
    }

    private class ProgressTask extends AsyncTask<String, String, Boolean> {
        //private Splash activity;


        public ProgressTask(Splash splash) {
            //this.activity = splash;
            //context = splash;
        }

        /** application context. */
        //private Context context;

        protected void onPreExecute() {

        }

        protected void onCancelled (){

        }

        @Override
        protected void onPostExecute(final Boolean success) {
            dialog.dismiss();
            Intent newIntent = new Intent(Splash.this, Main.class);
            Splash.this.startActivity(newIntent);
        }


        protected void onProgressUpdate(String... msg) {

         }

        protected Boolean doInBackground(final String... args) {
            Log.v("Splash","Loading Hotels providers");
            HComparatorParser HParser = new HComparatorParser();
            Marchands=HParser.parse("t");
            Log.v("Splash","Loading Car providers");
            CComparatorParser CParser = new CComparatorParser();
            CarRenters = CParser.parse(0);
            Log.v("Splash","Travel Agencies");
            AgencyParser AParser=new AgencyParser();
            Agencies=AParser.parse();
            appCyberesa.setHProviders(Marchands);
            appCyberesa.setCProviders(CarRenters);
            appCyberesa.setAgencies(Agencies);

            return true;
        }
    }
}
package com.cyberesa.info;
导入java.util.ArrayList;
导入android.app.Activity;
导入android.content.Intent;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.util.Log;
公共课堂活动{
ArrayListArchands=新的ArrayList();
ArrayList carrenents=新的ArrayList();
ArrayList代理=新的ArrayList();
appCyberesa myApp=((appCyberesa)this.getApplication());
MyProgressDialog;
/**在首次创建活动时调用*/
@凌驾
创建公共空间(捆绑冰柱){
超级冰柱;
setContentView(R.layout.splashscreen);
dialog=MyProgressDialog.show(this,null,null);
新建ProgressTask(Splash.this).execute();
}
私有类ProgressTask扩展了AsyncTask{
//私人喷溅活动;
公共进程任务(飞溅){
//这个活动=飞溅;
//上下文=飞溅;
}
/**应用程序上下文*/
//私人语境;
受保护的void onPreExecute(){
}
取消时受保护的空(){
}
@凌驾
受保护的void onPostExecute(最终布尔值成功){
dialog.dismise();
Intent newIntent=newIntent(Splash.this,Main.class);
Splash.this.startActivity(newIntent);
}
受保护的void onProgressUpdate(字符串…msg){
}
受保护的布尔doInBackground(最终字符串…args){
Log.v(“飞溅”,“装载酒店供应商”);
HComparatorParser HParser=新的HComparatorParser();
Marchands=HParser.parse(“t”);
Log.v(“飞溅”、“装载车辆供应商”);
CComparatorParser CParser=新的CComparatorParser();
carrenents=CParser.parse(0);
Log.v(“飞溅”、“旅行社”);
AgencyParser AParser=新的AgencyParser();
Agencies=AParser.parse();
应用程序设置提供程序(Marchands);
应用程序。设置提供程序(Carrents);
appCyberesa.setAgencies(Agencies);
返回true;
}
}
}

为什么需要创建空列表并再次添加项目??另外
hProviders
设置时是否为空

public void setHProviders(ArrayList<Marchand> hProviders) {
        HProviders = hProviders;
}
public void setHProviders(数组列表hProviders){
HPProviders=HPProviders;
}

此行生成
NullPointerException

HProviders.addAll(hProviders);
因为调用时,
Marchand
null

myApp.setHProviders(Marchands);

确保
Marchand
不为空,或者更好,遵循Teja Kantamneni的建议。

您需要在
onCreate()中初始化变量
myApp
。创建实例时,您当前正在初始化此变量,如下所示:

appCyberesa myApp = ((appCyberesa)this.getApplication());

问题是,在创建
Splash
实例时,调用
getApplication()
将返回
null
,因为还没有设置必要的底层框架(这一切都发生在调用
onCreate()
之前的构造函数中)。只需将初始化移动到
onCreate()
,您就会很好。

对不起,Teja,同样的事情,同样的例外:(刚刚添加了
Log.v(“,valueOf(Marchands.size()))
它给出了48,所以我认为它不是空的?!所以唯一的选择是
myApp
是空的?你可以很容易地通过调试程序检查这个。下面是myApp声明:
appCyberesa myApp=((appCyberesa)this.getApplication())
它不能为null,non?!你在清单中声明了吗?
我通过向appCyberesa类添加静态修饰符部分解决了这个问题,但问题是当我这样做时:
someVar=appCyberesa.getHProviders();
我对someVar进行了更改,我还修改了
appCyberesa.getHProviders()当我再次阅读时,更改了。
NullPointerException
在源代码中给出了它发生的行。请确切告诉我们NPE发生在哪一行。它发生在这里:
myApp.setHProviders(Marchands);
appCyberesa myApp = ((appCyberesa)this.getApplication());