从JSON检索数据时出现NullPointer异常

时间:2014-02-25 19:38:30

标签: java android json nullpointerexception

我正在尝试使用JSON从我的服务器获取数据并将检索到的数据放入数组 这是检索类别,intitule,id_news,图像

的功能
public void getNewsFromServer(int beg){

    InputStream is = null;
    String result = "";

    ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
    nameValuePairs.add(new BasicNameValuePair("beg", Integer.toString(beg)));

    try {
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(strURL);
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        HttpResponse response = httpclient.execute(httppost);
        HttpEntity entity = response.getEntity();
        is = entity.getContent();
    } catch (Exception e) {
        Toast.makeText(context, e.toString(), Toast.LENGTH_LONG).show();
    }
    // conversion of the query into string
    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();
        result = sb.toString();


    } catch (Exception e) {
        Toast.makeText(context, e.toString(),Toast.LENGTH_LONG).show();
    }

    try {
        JSONArray jArray = new JSONArray(result);
        for (int i = 0; i < jArray.length(); i++) {
            JSONObject json_data = jArray.getJSONObject(i);

            id_news[i] = Integer.toString(json_data.getInt("id_news"));
            categorie[i] = json_data.getString("categorie");
            intitule[i] = json_data.getString("intitule");
            image[i] = json_data.getString("image");
        }


    }catch (Exception e){
        Toast.makeText(context, e.toString(),
                Toast.LENGTH_LONG).show();
    }
}

这是 MainActivity.java

String [] id_news= new String [20];
String [] categorie= new String [20];
String [] intitule= new String [20];
String [] image= new String [20];

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...   
 try{
    //get data from the server and put it in tables
    getNewsFromServer(beg);
 }catch(NullPointerException e)
    {
        Toast.makeText(this, e.toString(), Toast.LENGTH_LONG).show();
        e.getStackTrace();
    }
}

但我总是得到NULLPointerException 请帮忙

这些logCat跟踪 logCat

这是上下文的初始化 Context context = this;

但它会产生另一个异常 NetworkOnMainThreadException NullPointerException JSONException:字符0的输入结束 ..

4 个答案:

答案 0 :(得分:2)

NPE来自Toast初始化。确保您传递的context不为空。

由于您在异常catch块中使用toast,因此请使用以下方法记录异常堆栈跟踪: e.printStackTrace()要抓住根本原因。 (主要嫌疑人:NetworkOnMainThreadException

对于NetworkOnMainThreadException,您的网络是否在后台线程上运行。有关详情,请参阅How to fix android.os.NetworkOnMainThreadException?

答案 1 :(得分:0)

在您对Toast的调用中,context变量很可能为空。

从不捕获NullPointerException。确保它永远不会被抛出。

答案 2 :(得分:0)

正如laalto所指出的,NPE正在Toast声明中。

您能否提供有关如何初始化上下文的代码段。

还尝试使用getActivity()一次,看看它是否解决了这个问题。

如果确实如此,则override onAttach()并初始化其中的context。直接给予getActivity()不是一个好习惯。

导致

NetworkOnMainThreadException是因为您应该在单独的线程上进行网络调用 使用类似的东西:

Thread thread = new Thread()
{
    @Override
    public void run() {
        try {
           //your network calls here
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
};

thread.start();

答案 3 :(得分:0)

我通过使用AsyncTask

解决了这个问题
private class Asyn_GetNewsFromServer extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... params) {
        getNewsFromServer(beg);
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
                    //do what ever you want
    }
}

thx求助