我在以下代码中遇到空指针异常,知道为什么吗?
public class JSONParser {
static InputStream is = null;
static JSONObject jObj = null;
static String json = "";
static int GET = '1';
static int POST ='2';
// constructor
public JSONParser() {
}
public JSONObject getJSONFromUrl(String url, List<NameValuePair> params, int method) throws URISyntaxException {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpResponse httpResponse = null;
HttpEntity httpentity = null;
HttpPost postrequest = null;
try {
switch (method) {
case 1:
if(params!=null){
String paramString = URLEncodedUtils.format(params, "utf-8");
url += "?" + paramString;
}
Log.e("URL", url);
HttpGet httpGet = new HttpGet(url);
httpResponse = httpClient.execute(httpGet);
httpentity = httpResponse.getEntity();
break;
case 2:
postrequest = new HttpPost(url);
postrequest.setEntity(new UrlEncodedFormEntity(params,HTTP.UTF_8));
httpResponse = httpClient.execute(postrequest);
httpentity = httpResponse.getEntity();
if(httpentity !=null)
{
Log.i("RESPONSE", EntityUtils.toString(httpentity));
}
else{
Log.i("NULL", EntityUtils.toString(httpentity));
}
break;
}
is = httpentity.getContent();
}
catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
json = sb.toString();
Log.e("JSON", json);
} catch (Exception e) {
Log.e("Buffer Error", "Error converting result " + e.toString());
}
// try parse the string to a JSON object
try {
jObj = new JSONObject(json);
} catch (JSONException e) {
Log.e("JSON Parser", "Error parsing data " + e.toString());
}
// return JSON String
return jObj;
}
}
NPE
出现在行中
is = httpentity.getContent();
基本上,我是通过一个函数类访问这个类,最后通过另一个主类来实现它。
最佳答案
问题是您的 httpentity
在您要检索其内容的行中是 null
。您应该确保您的 method
是 1
或 2
,因为您可能会 - 错误地 - 省略整个 switch 语句并直接运行是=httpentity.getContent();
。
此外,如果您查看 Android 文档,您可以阅读:
public abstract HttpEntity getEntity () Added in API level 1
Obtains the message entity of this response, if any. The entity is provided by calling setEntity.
Returns the response entity, or null if there is none
这意味着如果没有响应实体,getEntity()
方法将返回null
。而且您仅在第二种情况下进行了空检查。你也应该在你想要检索内容的地方检查它,所以你的整个 try block 应该是这样的:
try {
switch (method) {
case 1:
if(params!=null){
String paramString = URLEncodedUtils.format(params, "utf-8");
url += "?" + paramString;
}
Log.e("URL", url);
HttpGet httpGet = new HttpGet(url);
httpResponse = httpClient.execute(httpGet);
httpentity = httpResponse.getEntity();
break;
case 2:
postrequest = new HttpPost(url);
postrequest.setEntity(new UrlEncodedFormEntity(params,HTTP.UTF_8));
httpResponse = httpClient.execute(postrequest);
httpentity = httpResponse.getEntity();
if(httpentity !=null)
{
Log.i("RESPONSE", EntityUtils.toString(httpentity));
}
else{
Log.i("NULL", EntityUtils.toString(httpentity));
}
break;
}
if(httpentity != null)
{
is = httpentity.getContent();
Log.i("RESPONSE", EntityUtils.toString(httpentity));
} else {
Log.i("NULL", EntityUtils.toString(httpentity));
}
}
catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
关于android - 空指针异常 : HTTP Entity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16097824/