Jump to content

JSON & ListView (e=NullPointerException)


Recommended Posts

Bonjour à tous,

J'ai un problème sans doute dans mon code que je n'arrive pas à trouver.

Mon appli, je vais chercher dans une base de données des données (xD comme si on le savait pas), et je veux les afficher dans une listView, problème le logCat me retourne un NullPointerException.

Voici le code :

JsonListViewActivity :

package fr.emergenceit.net;
import java.util.ArrayList;
import java.util.HashMap;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.ListActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
public class JsonListViewActivity extends ListActivity {
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();
    JSONObject json = JSONfunctions.getJSONfromURL("http://192.168.1.79/ville/ville.php");

    try{

	    JSONArray  pharmacie = json.getJSONArray("pharmacie");
	    for(int i=0;i<pharmacie.length();i++){
		 HashMap<String, String> map = new HashMap<String, String>();	 
		 JSONObject e = pharmacie.getJSONObject(i);
		 map.put("nomph", "ID_ville:" + e.getString("ID_ville"));
		 map.put("lat", "Nom_ville: " +  e.getString("Nom_ville"));
		 mylist.add(map);					   
	 }		 
    }
    catch(JSONException e) {
	    Log.e("log_tag", "Error parsing data "+e.toString());
    }

    ListAdapter adapter = new SimpleAdapter(
	   this,
	   mylist,
	   R.layout.main,
 new String[] { "nomph", "lat" },
    new int[] { R.id.item_title, R.id.item_subtitle });
 setListAdapter(adapter);

 final ListView lv = getListView();
    lv.setTextFilterEnabled(true); 
    lv.setOnItemClickListener(new OnItemClickListener() {
	 public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
	  @SuppressWarnings("unchecked")
		    HashMap<String, String> o = (HashMap<String, String>)
		 lv.getItemAtPosition(position);						
	  Toast.makeText(JsonListViewActivity.this, "ID '" + o.get("id") + "'was clicked.", Toast.LENGTH_SHORT).show();
	 }
    });

   }
}

JSONfunctions.java :

package fr.emergenceit.net;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;
import android.util.Log;
public class JSONfunctions {

public static JSONObject getJSONfromURL(String url){
    InputStream is = null;
    String result = "";
    JSONObject jArray = null;

    //http post
 try{
		 HttpClient httpclient = new DefaultHttpClient();
		 HttpPost httppost = new HttpPost(url);
		 HttpResponse response = httpclient.execute(httppost);
		 HttpEntity entity = response.getEntity();
		 is = entity.getContent();

 } catch(Exception e) {
		 Log.e("log_tag", "Error in http connection "+e.toString());
 }

 //convert response to 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) {
		 Log.e("log_tag", "Error converting result "+e.toString());
 }

 try{
  jArray = new JSONObject(result);		   
 } catch(JSONException e ){
		 Log.e("log_tag", "Error parsing data "+e.toString());
 }

 return jArray;
}
}

ville.php affiche :

[{"ID_ville":"1","Nom_ville":"Paris"},{"ID_ville":"2","Nom_ville":"Lille"},{"ID_ville":"3","Nom_ville":"Marseille"},{"ID_ville":"4","Nom_ville":"Lyon"},{"ID_ville":"5","Nom_ville":"Toulouse"},{"ID_ville":"6","Nom_ville":"Bordeaux"},{"ID_ville":"7","Nom_ville":"Nimes"}]

LogCat :

11-11 13:53:25.623: E/AndroidRuntime(1715): Uncaught handler: thread main exiting due to uncaught exception

11-11 13:53:25.633: E/AndroidRuntime(1715): java.lang.RuntimeException: Unable to start activity ComponentInfo{fr.emergenceit.net/fr.emergenceit.net.JsonListViewActivity}: java.lang.NullPointerException

11-11 13:53:25.633: E/AndroidRuntime(1715): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)

11-11 13:53:25.633: E/AndroidRuntime(1715): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)

11-11 13:53:25.633: E/AndroidRuntime(1715): at android.app.ActivityThread.access$2200(ActivityThread.java:119)

11-11 13:53:25.633: E/AndroidRuntime(1715): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)

11-11 13:53:25.633: E/AndroidRuntime(1715): at android.os.Handler.dispatchMessage(Handler.java:99)

11-11 13:53:25.633: E/AndroidRuntime(1715): at android.os.Looper.loop(Looper.java:123)

11-11 13:53:25.633: E/AndroidRuntime(1715): at android.app.ActivityThread.main(ActivityThread.java:4363)

11-11 13:53:25.633: E/AndroidRuntime(1715): at java.lang.reflect.Method.invokeNative(Native Method)

11-11 13:53:25.633: E/AndroidRuntime(1715): at java.lang.reflect.Method.invoke(Method.java:521)

11-11 13:53:25.633: E/AndroidRuntime(1715): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)

11-11 13:53:25.633: E/AndroidRuntime(1715): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

11-11 13:53:25.633: E/AndroidRuntime(1715): at dalvik.system.NativeStart.main(Native Method)

11-11 13:53:25.633: E/AndroidRuntime(1715): Caused by: java.lang.NullPointerException

11-11 13:53:25.633: E/AndroidRuntime(1715): at fr.emergenceit.net.JsonListViewActivity.onCreate(JsonListViewActivity.java:31)

11-11 13:53:25.633: E/AndroidRuntime(1715): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)

11-11 13:53:25.633: E/AndroidRuntime(1715): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)

Link to comment
Share on other sites

Comme le montre les logs, tu as une NullPointerException en ligne 31 de ton activity, c'est là qu'il aurait fallu chercher...

Mais, au vu du code, il y a quelques petits points qui font, à mon avis, que ça ne marche pas:

- le parsing d'une chaîne au format JSON se fait à l'aide de la classe JSONTokener, pas directement avec JSONObject

- ton script PHP te retourne un tableau d'objets, pas un objet, et donc ta méthode de parsing devrait retourner un JSONArray, pas un JSONObject

Voila les corrections que tu pourrais apporter:

- dans la classe JSONFunctions, remplacer la ligne

jArray = new JSONObject(result);

par

jArray = (JSONArray)new JSONTokener(result).nextValue();

et changer le type de retour de la fonction getJSONFromUrl en JSONArray

- dans la classe de ton Activity, supprimer la ligne

JSONObject json = JSONfunctions.getJSONfromURL("http://192.168.1.79/ville/ville.php"); 

et remplacer la ligne

JSONArray  pharmacie = json.getJSONArray("pharmacie"); 

par

JSONArray pharmacie = JSONfunctions.getJSONfromURL("http://192.168.1.79/ville/ville.php");

Cela devrait ensuite mieux fonctionner

  • Like 1
Link to comment
Share on other sites

Merci beaucoup de ta réponse mais malheureusement j'ai déjà résolu le problème hier soir (j'ai pas eu le temps de venir ici mettre résolu).

En faite je pense qu'avec ta méthode çà marcherai, mais moi j'ai triché dans mon code PHP pour que çà marche ^^

Enfin bon tant que çà marche c'est mon patron qui est content.

Juste dommage que la communauté ne soit pas plus présente sur ce forum.

D'ailleurs on fait comment pour mettre en résolut ?

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...