2015-11-25 2 views
0

Я играл с некоторыми JSON, пытаясь получить и отобразить строки, которые будут отображаться в пользовательском ListView с Textviews в моем приложении. Но при запуске я получаю исключение NullPointerException. Может кто-нибудь сказать мне, где я делаю ошибку, и, возможно, указать мне в правильном направлении.NullPointerException При получении данных JSON

Это 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; 
    } 
} 

Wrap класс:

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

URL-адрес:

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

Это doInBackground метод в AsyncTask в:

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

Вы проверили, было ли 'wrap' равно null перед вызовом' wrap.getModels() '? – LarsH

+0

Да обертка - null. – kinsell

+0

Я вижу, что вы вызываете getModels без вызова setModels. – Gi0rgi0s

ответ

0

Вы должны убедиться, что при создании объекта функция getModels() не имеет значения null. Некоторые парсеры Json используют только списки, но не создают их.

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

Я предполагаю, что он пытается добавить элементы в список, который является нулевым.

+0

Я сделал эту модификацию в классе Wrap .. но по-прежнему ту же ошибку. – kinsell

1

ОК, давайте работать через это логически ...

Когда вы получите исключение, вы видите это в результате ...

for (Model model : wrap.getModels()) { 

... довольно просто wrap является null , пытаясь вызвать любой метод на нулевом объекте через NPE, не спорьте об этом - вам даже не нужно было показывать какой-либо другой код, чтобы понять, что это значит.

Так почему же wrapnull? Давайте посмотрим на то, где она обрабатывается (или, по крайней мере там, где он ДОЛЖЕН быть) ...

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

... так что если после вызова new Gson().fromJson(...) то wrap оказывается null, почему это? Очевидно, fromJson(...) возвращается null.

Итак, предположим, что вы прочитали документацию для fromJson(...) (что, я подозреваю, вы, возможно, не сделали), при использовании Reader из документов ...

Возвращает:

объект типа T из строки. Возвращает значение null, если json находится в EOF.

... кажется, ваш Reader находится на EOF. Так почему же так?

В основном HttpResponse не имеет HttpEntity с любым допустимым контентом. Либо ваш сервер просто ничего не возвращает полностью ORHttpPost не содержит достоверных данных, чтобы сервер мог вернуть что-либо действительное.

Другими словами, проверьте код сервера, и если все в порядке, проверьте, что вы публикуете.

+0

Спасибо за логическое объяснение, код сервера в порядке. И я использую те же имена полей в моей модели, вы говорите, что проблема в URL-адресе? im stuck here – kinsell

+0

вот дополнительная информация, если это помогает 'SO_URL =" http://www.example.com/webservice/?value ";' и 'PARAMS =" = [{% 22table% 22:% 20% 22locations% 22% 22operation% 22:% 20% 22% 22select,% 22transactionCompleted% 22:% 20true}] ";' – kinsell

Смежные вопросы