我一直在玩一些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
答案 0 :(得分:1)
好的,让我们在逻辑上解决这个问题......
当您收到异常时,您会看到它是......
的结果for (Model model : wrap.getModels()) {
...很简单wrap
是null
,试图通过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<>();
我认为它试图将列表中的元素添加为空。