2015-11-25 131 views
0

我一直在玩弄一些JSON,嘗試獲取並顯示字符串以顯示在我的應用程序中使用Textviews的自定義ListView中。但是我在運行時遇到了NullPointerException。有人可以告訴我我犯了什麼錯誤,並指出我可能正確的方向。NullPointerException當檢索JSON數據

這是JSON:

[{"id":"1","client_id":"1","client_name":"Company A"},{"id":"2","client_id":"2","client_name":"Company B"}] 

這是模型類:

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方法:

​​

我得到這個異常信息:

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.getModels()'之前,你測試過'wrap'是否爲null嗎? – LarsH

+0

是包裝爲空。 – kinsell

+0

我看到你正在調用getModels而不調用setModels。 – Gi0rgi0s

回答

0

創建對象時,應確保getModels()不爲空。一些Json解析器只使用列表,但從不創建它們。

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

我認爲它試圖將元素添加到這是空列表。

+0

我在包類中做了這個修改..但仍然是同樣的錯誤。 – kinsell

1

OK,讓我們通過這個邏輯工作...

當你得到你所看到的是作爲結果的例外......

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

...很簡單wrapnull ,試圖通過NPE調用任何空對象的方法 - 沒有爭論 - 你甚至不需要顯示任何其他代碼來找出那個。

那麼爲什麼是wrapnull?讓我們來看看在那裏的實例化(或者至少它應該)...

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

...因此,如果wrap原來調用new Gson().fromJson(...)再後是null,這是爲什麼?很明顯,fromJson(...)正在返回null

因此,假設您已閱讀文檔fromJson(...)(我懷疑您可能沒有這樣做),但是在使用Reader時,從文檔中找到...

返回:

從字符串類型T的對象。如果json位於EOF,則返回null。

...看來你的Reader是在EOF。那爲什麼呢?

基本上HttpResponse沒有HttpEntity與任何有效的內容。要麼你的服務器根本沒有返回任何句號HttpPost不包含有效數據,以便服務器返回任何有效的數據。

換句話說,檢查您的服務器代碼,如果沒關係,請檢查您發佈的內容。

+0

感謝您的合理解釋,服務器代碼很好。而我在我的模型中使用相同的字段名稱,你是說這個問題是在網址?即時貼在這裏 – kinsell

+0

這裏有一些更多的信息,如果它有助於'SO_URL =「http://www.example.com/webservice/?value」;'和'PARAMS =「= [{%22table%22:%20% 22locations%22%22operation%22:%20%22select%22%22transactionCompleted%22:%20true}]「;' – kinsell