为什么我在尝试解析JSON时在Android的多个库中有java.lang.NullPointerException

为什么我在尝试解析JSON时在Android的多个库中有java.lang.NullPointerException,android,json,parsing,nullpointerexception,simpleadapter,Android,Json,Parsing,Nullpointerexception,Simpleadapter,我试图在我的Android应用程序中解析JSON格式。我是开发android应用程序的新手,所以我参考了很多教程。我遵循了本教程中的步骤: 以下是我的MainActivity.java类: package com.example.carlajoyce.parsejson; import android.app.ListActivity; import android.app.ProgressDialog; import android.os.AsyncTask; import android.

我试图在我的Android应用程序中解析JSON格式。我是开发android应用程序的新手,所以我参考了很多教程。我遵循了本教程中的步骤:

以下是我的MainActivity.java类:

package com.example.carlajoyce.parsejson;

import android.app.ListActivity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ListAdapter;
import android.widget.SimpleAdapter;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.HashMap;

public class MainActivity extends ListActivity {

private static String url = "http://tech.ccare.jrhernani.com/tech/workorders";
private static final String TAG_WORKORDERINFO = "workorders";
private static final String TAG_ID = "id";
private static final String TAG_SUBJECT = "subject";
private static final String TAG_DESCRIPTION = "description";
private static final String TAG_INITIATED = "initiated";
private static final String TAG_FINISHED = "finished";
private static final String TAG_CREATEDAT = "created_at";
private static final String TAG_UPDATEDAT = "updated_at";
private static final String TAG_TICKETID = "ticket_id";
private static final String TAG_CREATEDBYID = "createdBy_id";
private static final String TAG_TECHNICIANID = "technician_id";
private static final String TAG_WORKORDERREFID = "workorderref_id";
private static final String TAG_WORKORDERSTATUSID = "workorderstatus_id";
private static final String TAG_DEPARTMENTID = "department_id";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    new GetWorkOrders().execute();
}

/**
 *Async task class to get JSON by making HTTP call
 */
private class GetWorkOrders extends AsyncTask<Void, Void, Void> {

    /*HashMap for ListView*/
    ArrayList<HashMap<String, String>> workOrderList;
    ProgressDialog pDialog;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(MainActivity.this);
        pDialog.setMessage("Please wait...");
        pDialog.setCancelable(false);
        pDialog.show();
    }

    @Override
    protected Void doInBackground(Void... arg0) {
        /*Creating service handler class instance*/
        WebRequest webreq = new WebRequest();

        /* Making a request to url and getting response*/

        String jsonStr = webreq.makeWebServiceCall(url, WebRequest.GETRequest);

        Log.d("Response: ", "> " + jsonStr);

        workOrderList = ParseJSON(jsonStr);

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        /*Dismiss the progress dialog*/
        if (pDialog.isShowing())
            pDialog.dismiss();
        /**
         * Updating parsed JSON data into ListView
         * */
        ListAdapter adapter = new SimpleAdapter(
                MainActivity.this, workOrderList,
                R.layout.list_item, new String[]{TAG_SUBJECT, TAG_DESCRIPTION}, new int[]{R.id.subject, R.id.description});

        setListAdapter(adapter);
    }
}

private ArrayList<HashMap<String, String>> ParseJSON(String json) {
    if (json != null) {
        try {
            // Hashmap for ListView
            ArrayList<HashMap<String, String>> workOrderList = new ArrayList<HashMap<String, String>>();

            JSONObject jsonObj = new JSONObject(json);

            // Getting JSON Array node
            JSONArray workOrders = jsonObj.getJSONArray(TAG_WORKORDERINFO);

            // looping through All WorkOrders
            for (int i = 0; i < workOrders.length(); i++) {
                JSONObject c = workOrders.getJSONObject(i);

                String id = c.getString(TAG_ID);
                String subject = c.getString(TAG_SUBJECT);
                String description = c.getString(TAG_DESCRIPTION);
                String initiated = c.getString(TAG_INITIATED);
                String finished = c.getString(TAG_FINISHED);
                String created_at = c.getString(TAG_CREATEDAT);
                String updated_at = c.getString(TAG_UPDATEDAT);
                String ticket_id = c.getString(TAG_TICKETID);
                String createdBy_id = c.getString(TAG_CREATEDBYID);
                String technician_id = c.getString(TAG_TECHNICIANID);
                String workorderref_id = c.getString(TAG_WORKORDERREFID);
                String workorderstatus_id = c.getString(TAG_WORKORDERSTATUSID);
                String department_id = c.getString(TAG_DEPARTMENTID);


                // tmp hashmap for single student
                HashMap<String, String> workOrder = new HashMap<String, String>();

                // adding each child node to HashMap key => value
                workOrder.put(TAG_ID,id);
                workOrder.put(TAG_SUBJECT, subject);
                workOrder.put(TAG_DESCRIPTION, description);
                workOrder.put(TAG_INITIATED, initiated);
                workOrder.put(TAG_FINISHED, finished);
                workOrder.put(TAG_CREATEDAT, created_at);
                workOrder.put(TAG_UPDATEDAT, updated_at);
                workOrder.put(TAG_TICKETID, ticket_id);
                workOrder.put(TAG_CREATEDBYID, createdBy_id);
                workOrder.put(TAG_TECHNICIANID, technician_id);
                workOrder.put(TAG_WORKORDERREFID, workorderref_id);
                workOrder.put(TAG_WORKORDERSTATUSID, workorderstatus_id);
                workOrder.put(TAG_DEPARTMENTID, department_id);

                // adding student to students list
                workOrderList.add(workOrder);
            }
            return workOrderList;
        } catch (JSONException e) {
            e.printStackTrace();
            return null;
        }
    } else {
        Log.e("ServiceHandler", "Couldn't get any data from the url.");
        return null;
    }
}



@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public 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);
}
注意:我还下载了教程提供的代码,效果很好。
提前感谢。

如果
workOrderList
为空,则会发生这种情况

在调用适配器的构造函数之前,必须初始化此列表

 ListAdapter adapter = new SimpleAdapter(
                MainActivity.this, workOrderList,
                R.layout.list_item, new String[]{TAG_SUBJECT, TAG_DESCRIPTION}, new int[]{R.id.subject, R.id.description});

之所以会发生这种情况,是因为您的
ParseJSON
(在
doInBackground
方法中调用)可以返回
null

,我认为您应该首先初始化适配器并使用空列表查看,所以请移动此项:

       ListAdapter adapter = new SimpleAdapter(
            MainActivity.this, workOrderList,
            R.layout.list_item, new String[]{TAG_SUBJECT, TAG_DESCRIPTION}, new int[]{R.id.subject, R.id.description}); 

       setListAdapter(adapter);
要在MainActivity中创建()并在作业完成时,只需在onPostExecute()中通知适配器数据集已更改

       adapter.notifyDataSetChanged();
请让我知道它是否适合你

       adapter.notifyDataSetChanged();