【问题标题】:getting a null pointer exception in android when trying to retrieve data from online server using json parsing尝试使用 json 解析从在线服务器检索数据时,在 android 中出现空指针异常
【发布时间】:2015-02-10 20:48:11
【问题描述】:

我正在尝试从在线数据库中获取一些数据到 android 中的列表视图,即使尝试从 localhost 数据库中获取数据,我也会收到空指针异常,我猜它们是 jsonArray 的一些问题。

public class MainActivity extends Activity {
private String jsonResult;
private String url =  "http://cpriyankara.coolpage.biz/employee_details.php";
private ListView listView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    listView = (ListView) findViewById(R.id.listView1);
    accessWebService();
}



// Async Task to access the web
private class JsonReadTask extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... params) {
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(params[0]);
        try {
            HttpResponse response = httpclient.execute(httppost);
            jsonResult = inputStreamToString(
                    response.getEntity().getContent()).toString();
        }

        catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    private StringBuilder inputStreamToString(InputStream is) {
        String rLine = "";
        StringBuilder answer = new StringBuilder();
        BufferedReader rd = new BufferedReader(new InputStreamReader(is));

        try {
            while ((rLine = rd.readLine()) != null) {
                answer.append(rLine);
            }
        }

        catch (IOException e) {
            // e.printStackTrace();
            Toast.makeText(getApplicationContext(),
                    "Error..." + e.toString(), Toast.LENGTH_LONG).show();
        }
        return answer;
    }

    @Override
    protected void onPostExecute(String result) {
        ListDrwaer();
    }
}// end async task

public void accessWebService() {
    JsonReadTask task = new JsonReadTask();
    // passes values for the urls string array
    task.execute(new String[] { url });
}

// build hash set for list view
public void ListDrwaer() {
    List<Map<String, String>> employeeList = new ArrayList<Map<String, String>>();

    try {
        JSONObject jsonResponse = new JSONObject(jsonResult);
        JSONArray jsonMainNode = jsonResponse.optJSONArray("emp_info");

        for (int i = 0; i < jsonMainNode.length(); i++) {
            JSONObject jsonChildNode = jsonMainNode.getJSONObject(i);
            String name = jsonChildNode.optString("employee name");
            String number = jsonChildNode.optString("employee no");
            String outPut = name + "-" + number;
            employeeList.add(createEmployee("employees", outPut));
        }
    } catch (JSONException e) {
        Toast.makeText(getApplicationContext(), "Error" + e.toString(),
                Toast.LENGTH_SHORT).show();
    }

    SimpleAdapter simpleAdapter = new SimpleAdapter(this, employeeList,
            android.R.layout.simple_list_item_1,
            new String[] { "employees" }, new int[] { android.R.id.text1 });
    listView.setAdapter(simpleAdapter);
}

private HashMap<String, String> createEmployee(String name, String number) {
    HashMap<String, String> employeeNameNo = new HashMap<String, String>();
    employeeNameNo.put(name, number);
    return employeeNameNo;
}

我的日志是:

11 01:48:33.290    1328-1328/com.example.gautam.mysqlapp E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.gautam.mysqlapp, PID: 1328
java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
        at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116)
        at org.json.JSONTokener.nextValue(JSONTokener.java:94)
        at org.json.JSONObject.<init>(JSONObject.java:156)
        at org.json.JSONObject.<init>(JSONObject.java:173)
        at com.example.gautam.mysqlapp.MainActivity.ListDrwaer(MainActivity.java:100)
        at com.example.gautam.mysqlapp.MainActivity$JsonReadTask.onPostExecute(MainActivity.java:85)
        at com.example.gautam.mysqlapp.MainActivity$JsonReadTask.onPostExecute(MainActivity.java:45)
        at android.os.AsyncTask.finish(AsyncTask.java:632)
        at android.os.AsyncTask.access$600(AsyncTask.java:177)
        at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5221)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

【问题讨论】:

  • MainActivity 的第 100 行是什么?
  • 请检查 LIstDrwer 中 jsonMainNode 的值
  • 我试了你的代码,效果很好!
  • @kelvincer 如果它对你有用,这意味着问题出在我的连接上?
  • 你想要代码吗?

标签: android mysql json nullpointerexception


【解决方案1】:

在构建结果字符串jsonResult 时,您得到了IOException 或ClientProtocolException;记录但以其他方式忽略它;继续;返回空值;然后尝试用空字符串构造一个JSONObject,这导致NPE在构造函数中下降了几层。

道德:不要写这样的代码。您的代码不应超出异常。在尝试对它进行任何操作之前,您至少应该检查 jsonResult 是否为 null。

【讨论】:

  • 那么如何摆脱它..?如果相同的代码对其他人来说工作正常,这意味着问题出在我的连接上……?
  • 我已经告诉你如何摆脱它,有两种不同的方式。再看一遍。
猜你喜欢
  • 2023-03-31
  • 2019-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-04
  • 1970-01-01
相关资源
最近更新 更多