Volley android java.lang.NullPointerException

时间:2014-07-01 20:27:57

标签: java android android-volley

我是开发Android应用程序的新手,我正在努力使用我的代码,我收到以下错误,我无法理解为什么会发生这种情况,我正在尝试使用凌空连接到一个API,但在此之前,用户必须首先登录然后查看内容。

07-01 17:21:16.143  22971-23604/com.rep E/YOUR_APP_LOG_TAG﹕ I got an error
    java.lang.NullPointerException
            at com.rep.webservice.volley.toolbox.Volley.newRequestQueue(Volley.java:45)
            at com.rep.webservice.rest.ClientesRest.getClientes(ClientesRest.java:52)
            at com.rep.webservice.Sincronizar.start(Sincronizar.java:26)
            at com.rep.app.login.LoginActivity$SincronizarTask.doInBackground(LoginActivity.java:311)
            at com.rep.app.login.LoginActivity$SincronizarTask.doInBackground(LoginActivity.java:280)
            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:841)

我正在做的是,首先我获取API数据:

mSincronizarTask = new SincronizarTask(getApplicationContext());
            mSincronizarTask.execute((Void) null);

然后我创建一个Asynctask:

public class SincronizarTask extends AsyncTask<Void, Void, Boolean> {

        private Context ctx;
        private ProgressDialog mProgressDialog;
        private Sincronizar mSincronizar = new Sincronizar(this.ctx);

        public SincronizarTask(Context activity) {
            Log.i("RM", "construct");
            ctx = activity;

        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            Log.i("RM", "onPreExecute");
        }

        @Override
        protected Boolean doInBackground(Void... params) {

            Log.i("RM", "doInBackground");

            try {
                mSincronizar.start();
            } catch (Exception e) {
                Log.i("RM", String.valueOf(e.getStackTrace()));
            }

//            this.mProgressDialog.dismiss();
            return true;

        }

        @Override
        protected void onPostExecute(final Boolean success) {
            Log.i("RM", "TOTAL: " + String.valueOf(mSincronizar.total()));
        }

        @Override
        protected void onCancelled() {
            Log.i("RM", "onCancelled");
            mAutenticacaoLocalTask = null;
//            this.mProgressDialog.dismiss();
        }

    }    

这是Sync类:

public class Sincronizar {

    private Context context;
    private List Clientes;

    public Sincronizar(Context ctx) {
        this.context = ctx;
    }

    public void start() {

        try {
            /* cria o objeto ClienteReste */
            ClientesRest mClientesRest = new ClientesRest(this.context);

            /* dispara a consulta pelo recurso "clientes" da API */
            this.Clientes = mClientesRest.getClientes();
        } catch (Exception e) {
            Log.i("RM", String.valueOf(e.getStackTrace()));
        }

    }

    public Integer total() {
        return 100;
    }

}

最后是Clientrest类:

 public class ClientesRest extends Servidor {

    private String recursoRest = "clientes";

    private List arrayClientes;

    private RequestQueue mRequestQueue ;

    private Context context;

    public ClientesRest(Context ctx) {
        this.context = ctx;
    }

    public final List getClientes() {

        String url = this.URL_WS + recursoRest;

        Log.i("RM", "URL DE CONSULTA: " + url);


        try {



            mRequestQueue = Volley.newRequestQueue(this.context);

            JsonObjectRequest mJsonObjectRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {


                @Override
                public void onResponse(JSONObject response) {
                    parseJSON(response);

                    Log.i("RM", "resposta da api: " + response.toString());


                }

            }, new Response.ErrorListener() {

                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.i("RM", error.getMessage());
                }

            }
            ) {
                @Override
                public Map<String, String> getHeaders() throws AuthFailureError {
                    HashMap<String, String> headers = new HashMap<String, String>();
                    headers.put("TOKEN", "99KI9Gj68CgCf70deM22Ka64chef2C40Gm2lFJ0bDAcbFfd19MfacGf3FFm8CM1hG0eDiIk8");
                    return headers;
                }
            };

            mRequestQueue.add(mJsonObjectRequest);





        } catch (Exception e) {
            Log.e("YOUR_APP_LOG_TAG", "I got an error", e);
        }

        return this.arrayClientes;

    }

    private void parseJSON(JSONObject json) {
        try {

            Log.i("RM", "executou o parseJSON");

            /* array para armazenar os clientes */
            this.arrayClientes = new ArrayList<ClienteModel>();

            /* pega o array "dados" que vem na resposta da consulta ao rest */
            JSONArray dados = json.getJSONArray("dados");

            /* percorre o array */
            for (int i = 0; i < dados.length(); i++) {

                /* pega a posição de cada linha no array */
                JSONObject item = dados.getJSONObject(i);

                /* cria um objeto do tipo ClienteModel */
                ClienteModel mClienteModel = new ClienteModel();

                /* cadastra os dados necessários no objeto mClienteModel */
                mClienteModel.set_idrm(Integer.parseInt(item.optString("id")));
                mClienteModel.set_nome(item.optString("nome"));
                mClienteModel.set_tipo(item.getString("tipo"));
                mClienteModel.set_endereco(item.optString("endereco"));
                mClienteModel.set_numero(item.optString("numero"));
                mClienteModel.set_complemento(item.optString("complemento"));
                mClienteModel.set_cep(item.optString("cep"));
                mClienteModel.set_bairro(item.optString("bairro"));
                mClienteModel.set_cidade(item.optString("cidade"));
                mClienteModel.set_estado(item.optString("estado"));
                mClienteModel.set_informacao_adicional("informacao_adicional");

                /* adicionar o objeto mClienteModel no array de Clientes "arrayClientes" */
                this.arrayClientes.add(mClienteModel);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }


    }
}

这是ClientsModel:

public class ClienteModel {

    private int _id;
    private int _idrm;
    private String _nome;
    private String _tipo;
    private String _endereco;
    private String _numero;
    private String _complemento;
    private String _cep;
    private String _bairro;
    private String _cidade;
    private String _estado;
    private String _informacao_adicional;

    public ClienteModel() {}

    public ClienteModel(String _nome, String _tipo, String _endereco, String _numero, String _complemento, String _cep, String _bairro, String _cidade, String _estado, String _informacao_adicional) {
        this._nome = _nome;
        this._tipo = _tipo;
        this._endereco = _endereco;
        this._numero = _numero;
        this._complemento = _complemento;
        this._cep = _cep;
        this._bairro = _bairro;
        this._cidade = _cidade;
        this._estado = _estado;
        this._informacao_adicional = _informacao_adicional;
    }

    public ClienteModel(int _idrm, String _nome, String _tipo, String _endereco, String _numero, String _complemento, String _cep, String _bairro, String _cidade, String _estado, String _informacao_adicional) {
        this._idrm = _idrm;
        this._nome = _nome;
        this._tipo = _tipo;
        this._endereco = _endereco;
        this._numero = _numero;
        this._complemento = _complemento;
        this._cep = _cep;
        this._bairro = _bairro;
        this._cidade = _cidade;
        this._estado = _estado;
        this._informacao_adicional = _informacao_adicional;
    }

    public ClienteModel(int _id, int _idrm, String _nome, String _tipo, String _endereco, String _numero, String _complemento, String _cep, String _bairro, String _cidade, String _estado, String _informacao_adicional) {
        this._id = _id;
        this._idrm = _idrm;
        this._nome = _nome;
        this._tipo = _tipo;
        this._endereco = _endereco;
        this._numero = _numero;
        this._complemento = _complemento;
        this._cep = _cep;
        this._bairro = _bairro;
        this._cidade = _cidade;
        this._estado = _estado;
        this._informacao_adicional = _informacao_adicional;
    }

    public int get_id() {
        return _id;
    }

    public void set_id(int _id) {
        this._id = _id;
    }

    public int get_idrm() {
        return _idrm;
    }

    public void set_idrm(int _idrm) {
        this._idrm = _idrm;
    }

    public String get_nome() {
        return _nome;
    }

    public void set_nome(String _nome) {
        this._nome = _nome;
    }

    public String get_tipo() {
        return _tipo;
    }

    public void set_tipo(String _tipo) {
        this._tipo = _tipo;
    }

    public String get_endereco() {
        return _endereco;
    }

    public void set_endereco(String _endereco) {
        this._endereco = _endereco;
    }

    public String get_numero() {
        return _numero;
    }

    public void set_numero(String _numero) {
        this._numero = _numero;
    }

    public String get_complemento() {
        return _complemento;
    }

    public void set_complemento(String _complemento) {
        this._complemento = _complemento;
    }

    public String get_cep() {
        return _cep;
    }

    public void set_cep(String _cep) {
        this._cep = _cep;
    }

    public String get_bairro() {
        return _bairro;
    }

    public void set_bairro(String _bairro) {
        this._bairro = _bairro;
    }

    public String get_cidade() {
        return _cidade;
    }

    public void set_cidade(String _cidade) {
        this._cidade = _cidade;
    }

    public String get_estado() {
        return _estado;
    }

    public void set_estado(String _estado) {
        this._estado = _estado;
    }

    public String get_informacao_adicional() {
        return _informacao_adicional;
    }

    public void set_informacao_adicional(String _informacao_adicional) {
        this._informacao_adicional = _informacao_adicional;
    }

    @Override
    public String toString() {
        return "ClienteModel{" +
                "_id=" + _id +
                ", _idrm=" + _idrm +
                ", _nome='" + _nome + '\'' +
                ", _tipo='" + _tipo + '\'' +
                ", _endereco='" + _endereco + '\'' +
                ", _numero='" + _numero + '\'' +
                ", _complemento='" + _complemento + '\'' +
                ", _cep='" + _cep + '\'' +
                ", _bairro='" + _bairro + '\'' +
                ", _cidade='" + _cidade + '\'' +
                ", _estado='" + _estado + '\'' +
                ", _informacao_adicional='" + _informacao_adicional + '\'' +
                '}';
    }
}

3 个答案:

答案 0 :(得分:1)

我认为引发了空指针异常,因为在构造函数中你没有正确传递上下文,这是一个假设,因为你没有发布ClientesRest(Context ctx)调用。

我的建议是你从主要活动中调用构造函数,如下所示:

ClientesRest clientesRest = new ClientesRest(getApplicationContext());

答案 1 :(得分:1)

你宣布

private Sincronizar mSincronizar = new Sincronizar(this.ctx);

但此时ctx为空。它仅在构造函数

中初始化
ctx = activity;

在构造函数中,您需要延迟mSincronizar的初始化,直到ctx不为空:

    public SincronizarTask(Context activity) {
        ctx = activity;
        mSincronizar = new Sincronizar(this.ctx);
    }

答案 2 :(得分:0)

您是否在清单文件中添加了这一行?

  android:name=".helper.AppController"

这是一个例子。

   <application
    android:name=".helper.AppController"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    ...
    ...
    />