2015-02-10 47 views
-1

我想從在線數據庫中獲取一些dat到android中的listview,即使嘗試獲取空指針異常來自localhost數據庫的數據,我猜他們是jsonArray的一些問題。在android中嘗試從在線服務器使用json解析檢索數據時出現空指針異常

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) 
+0

「MainActivity」的第100行是什麼? – iRuth 2015-02-10 20:54:47

+0

請在LIstDrwer中檢查** jsonMainNode **的值 – vinitius 2015-02-10 20:57:22

+0

我試過了你的代碼,它完美地工作! – kelvincer 2015-02-10 21:06:55

回答

0

你有一個IOException或建立結果字符串jsonResultClientProtocolException;記錄,但否則忽略它;繼續;返回null;然後嘗試用空字符串構造一個JSONObject,這導致NPE在構造函數中向下幾層。

道德:不要寫這樣的代碼。你的代碼不應該超出例外。至少在嘗試使用它之前,您應該先檢查jsonResult爲null。

+0

所以如何擺脫它..?如果相同的代碼工作正常的其他人,這意味着問題是與我的連接似乎...? – aniroid 2015-02-10 21:23:24

+0

我已經告訴過你如何以兩種不同的方式擺脫它。再看一遍。 – EJP 2015-02-10 21:37:00

相關問題