2013-04-19 6 views
3

Я получаю исключение null-указателя по следующему коду, любая идея почему?Исключение Null Pointer: HTTP Entity

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(); 

В принципе, я доступ к этому классу с классом функций и, наконец, реализует его через другой основной класс.

+0

Это означает, что вам не удалось получить ответ от сервера. –

+0

полная stacktrace от logcat и ответ от сервера? –

ответ

3

Проблема в том, что ваш httpentity находится в строке, где вы хотите получить ее содержимое. Вы должны убедиться, что ваш method либо 1, либо 2, потому что вы можете - по ошибке - опустить весь оператор switch и запустить прямо на is = httpentity.getContent();.

Кроме того, если вы проверяете Android документации, вы можете прочитать, что:

общественного абстрактного HttpEntity GetEntity() Добавлено в уровне API 1

Получает сообщение сущность этого ответа, если таковые имеются. Сущность предоставляется путем вызова setEntity.

Возвращает объект ответа, или ноль, если нет ни

Это означает, что если нет объекта ответа, getEntity() метод вернет null. И вы сделали нулевую проверку только во втором случае. Вы должны проверить это также в том месте, где хотите получить контент, поэтому весь блок try должен выглядеть так:

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(); 
} 
Смежные вопросы