android - 空指针异常 : HTTP Entity

标签 android json http httprequest

我在以下代码中遇到空指针异常,知道为什么吗?

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。您应该确保您的 method12,因为您可能会 - 错误地 - 省略整个 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/

相关文章:

javascript - 如何在 React Native 中正确突出显示文本?

python - 用ansible中的多个值替换多个模式

git - 可以在不克隆的情况下通过 http 读取 git 元数据吗

android - 如何正确跟踪播放位置? [Android 媒体广播通知 Spotify API]

android - 如何运行 Volley 测试?

android - 在android中动态添加UI内容

python - 删除不同Json列表python中的重复值

json - Swift 3 字典 JSON

http - 在一个结构化的日志行中跟踪 Go 中的 HTTP 请求

xml - 在浏览器中打开 SVG 呈现 XML 代码而不是图像