NullPointerException检索JSON数据时

时间:2015-11-25 21:56:51

标签: android json

我一直在玩一些JSON,尝试获取并显示字符串,以便在我的应用中使用Textview在自定义ListView中显示。但是我在运行时遇到了NullPointerException。有人可以告诉我我在哪里犯了错误并指出了正确的方向。

这是JSON:

[{"id":"1","client_id":"1","client_name":"Company A"},{"id":"2","client_id":"2","client_name":"Company B"}]

这是Model类:

public class Model {
    private String client_name;
    public String getClient_name() {
        return client_name;
    }
    public void setClient_name(String client_name) {
        this.client_name = client_name;
    }
}

换行课程:

public class Wrap {
   private ArrayList<Model> models;

    public ArrayList<Model> getModels() {
        return models;
    }

    public void setModels(ArrayList<Model> models) {
        this.models = models;
    }
}

这是我的适配器:

public class Adapter extends ArrayAdapter<Model> {
    public Adapter(Context context, int resource) {
        super(context, resource);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;

        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.listview_item, null);
            viewHolder = new ViewHolder(convertView);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        final Model p = getItem(position);
        viewHolder.textone.setText(p.getClient_name());

        return convertView;
    }
}

ViewHolder:

public class ViewHolder {
    public TextView textone;
    public ViewHolder(View convertView)
    {
       textone = (TextView)convertView.findViewById(R.id.txt_field);
    }
}

网址:

private static final String SO_URL = "http://www.example.com/webservice/?value";
private static final String PARAMS = "[{\"table\":\"locations\",\"operation\":\"select\"}]";

这是AsyncTask的doInBackground方法:

protected String doInBackground(Void... params) {
            try {
                //Create an HTTP client
               String  URL = URLEncoder.encode(PARAMS, "UTF-8");
                HttpClient client = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(SO_URL + URL);

                //Perform the request and check the status code
                HttpResponse response = client.execute(httpPost);
                StatusLine statusLine = response.getStatusLine();
                if(statusLine.getStatusCode() == 200) {
                    HttpEntity entity = response.getEntity();
                    InputStream content = entity.getContent();

                    try {
                        //Read the server response and attempt to parse it as JSON
                        Reader reader = new InputStreamReader(content);

                        Wrap wrap =  new Gson().fromJson(reader,Wrap.class);
                        for (Model model : wrap.getModels()) {
                            adapter.add(model);
                        }
                        adapter.notifyDataSetChanged();
                        content.close();
                    } catch (Exception ex) {
                        Log.e(TAG, "Failed to parse JSON due to: " + ex);
                        failedLoadingPosts();
                    }
                } else {
                    Log.e(TAG, "Server responded with status code: " + statusLine.getStatusCode());
                    failedLoadingPosts();
                }
            } catch(Exception ex) {
                Log.e(TAG, "Failed to send HTTP POST request due to: " + ex);
                failedLoadingPosts();
            }
            return null;

我收到了这个例外消息:

Failed to parse JSON due to: java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.ArrayList com.bloomcore.dbnewapp.Wrap.getModels()' on a null object reference

2 个答案:

答案 0 :(得分:1)

好的,让我们在逻辑上解决这个问题......

当您收到异常时,您会看到它是......

的结果
for (Model model : wrap.getModels()) {

...很简单wrapnull,试图通过NPE调用null对象上的任何方法 - 没有争论 - 你甚至不需要显示任何其他代码想出那个。

为什么wrap null?让我们看看它实例化的位置(或者至少它应该的位置)......

Wrap wrap =  new Gson().fromJson(reader,Wrap.class);

...所以如果在致电new Gson().fromJson(...)之后,wrap原来是null,为什么会这样?显然,fromJson(...)正在返回null

因此,假设您已阅读fromJson(...)的文档(我怀疑您可能没有这样做),在使用Reader时,请参阅文档......

  

返回:

     

字符串中类型为T的对象。如果json处于EOF,则返回null。

......您的Reader似乎在EOF。那为什么会这样呢?

基本上HttpResponse没有包含任何有效内容的HttpEntity。您的服务器只是没有返回任何完全停止 HttpPost不包含有效数据,以便服务器返回任何有效的内容。

换句话说,检查您的服务器代码,如果没问题,请检查您发布的内容。

答案 1 :(得分:0)

创建Object时,应确保getModels()不为null。一些Json解析器只使用列表但从不创建它们。

private ArrayList<Model> models = new ArrayList<>();

我认为它试图将列表中的元素添加为空。