首页 > Android使用volley的一个空指针问题

Android使用volley的一个空指针问题

使用了volley的listview,但是直接停止运行。
小弟看了一天,还是不明白,问题出在哪里,求指点
错误提示:

E/AndroidRuntime: FATAL EXCEPTION: main
                                                         Process: com.xd.v2ex, PID: 32632
                                                         java.lang.RuntimeException: Unable to start activity ComponentInfo{com.xd.v2ex/com.xd.v2ex.activity.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.xd.v2ex.utils.ApplicationController.addToRequestQueue(com.android.volley.Request)' on a null object reference
                                                             at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2702)
                                                             at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2767)
                                                             at android.app.ActivityThread.access$900(ActivityThread.java:177)
                                                             at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1449)
                                                             at android.os.Handler.dispatchMessage(Handler.java:102)
                                                             at android.os.Looper.loop(Looper.java:145)
                                                             at android.app.ActivityThread.main(ActivityThread.java:5981)
                                                             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:1399)
                                                             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
                                                          Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.xd.v2ex.utils.ApplicationController.addToRequestQueue(com.android.volley.Request)' on a null object reference
                                                             at com.xd.v2ex.activity.MainActivity.fetchMovies(MainActivity.java:116)
                                                             at com.xd.v2ex.activity.MainActivity.onCreate(MainActivity.java:79)
                                                             at android.app.Activity.performCreate(Activity.java:6289)
                                                             at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
                                                             at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2655)
                                                             at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2767) 
                                                             at android.app.ActivityThread.access$900(ActivityThread.java:177) 
                                                             at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1449) 
                                                             at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                             at android.os.Looper.loop(Looper.java:145) 
                                                             at android.app.ActivityThread.main(ActivityThread.java:5981) 
                                                             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:1399) 
                                                             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194) 

MainActivity

package com.xd.v2ex.activity;

import android.app.ProgressDialog;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.util.Log;
import android.view.View;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ListView;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.xd.v2ex.R;
import com.xd.v2ex.adapter.LatestAdapter;
import com.xd.v2ex.bean.ItemInfo;
import com.xd.v2ex.utils.ApplicationController;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {

private static final String TAG = MainActivity.class.getSimpleName();

private ArrayList<ItemInfo> itemInfos;
private LatestAdapter latestAdapter;
private ListView latestListView;

private static final String url = "http://www.v2ex.com/api/topics/latest.json";

private ProgressDialog pDialog;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.setDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);

    /**
    • listview
      */

         latestListView = (ListView) findViewById(R.id.latestListView);
      
         itemInfos = new ArrayList<ItemInfo>();
      
         fetchMovies();
         latestAdapter = new LatestAdapter(MainActivity.this, itemInfos);
      
         latestListView.setAdapter(latestAdapter);

      }

    1. void fetchMovies() {

         JsonArrayRequest req = new JsonArrayRequest(url, new Response.Listener<JSONArray>() {
      
             @Override
             public void onResponse(JSONArray jsonArray) {
      
                 for (int i = 0; i < jsonArray.length(); i++) {
                     try {
                         JSONObject object=jsonArray.getJSONObject(i);
                         ItemInfo itemInfo=new ItemInfo();
                         itemInfo.setTitle(object.getString("title"));
                         itemInfo.setImage("http:"+object.getJSONObject("member").getString("avatar_large"));
                         itemInfo.setNode(object.getString("created"));
                         itemInfo.setAuthor(object.getString("id"));
      
                         itemInfos.add(itemInfo);
                     } catch (JSONException e) {
                         e.printStackTrace();
                     }
      
                 }
                 //ע��ˢ������
                 latestAdapter.notifyDataSetChanged();
             }
         }, new Response.ErrorListener() {
             @Override
             public void onErrorResponse(VolleyError volleyError) {
                 Log.e(TAG, "error:" + volleyError.getMessage());
             }
         });
         ApplicationController.getInstance().addToRequestQueue(req);

      }

      @Override

    2. void onBackPressed() {

         DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
         if (drawer.isDrawerOpen(GravityCompat.START)) {
             drawer.closeDrawer(GravityCompat.START);
         } else {
             super.onBackPressed();
         }

      }

      @Override

    3. boolean onCreateOptionsMenu(Menu menu) {

         // Inflate the menu; this adds items to the action bar if it is present.
         getMenuInflater().inflate(R.menu.main, menu);
         return true;

      }

      @Override

    4. boolean onOptionsItemSelected(MenuItem item) {

         // Handle action bar item clicks here. The action bar will
         // automatically handle clicks on the Home/Up button, so long
         // as you specify a parent activity in AndroidManifest.xml.
         int id = item.getItemId();
      
         //noinspection SimplifiableIfStatement
         if (id == R.id.action_settings) {
             return true;
         }
      
         return super.onOptionsItemSelected(item);

      }

      @SuppressWarnings("StatementWithEmptyBody")
      @Override

    5. boolean onNavigationItemSelected(MenuItem item) {

         // Handle navigation view item clicks here.
         int id = item.getItemId();
      
         if (id == R.id.nav_camera) {
             // Handle the camera action
         } else if (id == R.id.nav_gallery) {
      
         } else if (id == R.id.nav_slideshow) {
      
         } else if (id == R.id.nav_manage) {
      
         } else if (id == R.id.nav_share) {
      
         } else if (id == R.id.nav_send) {
      
         }
      
         DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
         drawer.closeDrawer(GravityCompat.START);
         return true;

      }
      }


    把fetchMovies()方法调用放到latestListView.setAdapter之后


    ApplicationController.getInstance().addToRequestQueue(req); 既然是这句报错了,你就验证下前后是否是null的,打印下ApplicationController.getInstance() 和 req 这两个,在调用前,不过看你req是在上面重新new的一个,所以ApplicationController.getInstance()这个为null的可能性比较大。

    【热门文章】
    【热门文章】