IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Exception ex avec ex == null


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2002
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 121
    Par défaut Exception ex avec ex == null
    Bonjour,

    Je suis entrain de développer une Application pour android 3.2.1
    Et soudainement je me retrouve face a une petit soucis.
    Après quelques recherche qui ne m'ont pas vraiment apportées la
    réponse que j’attendais, je fait donc appel a vous.
    J'aimerai quelques explication concernant le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    		try {
    			String URL = "http://127.0.0.1";
     
    			HttpClient httpclient = new DefaultHttpClient();
    			HttpPost httppost = new HttpPost(URL);
     
    			List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
    			Set keys = Parametres.keySet();
    			for (Iterator i = keys.iterator(); i.hasNext();) {
    				String key = (String) i.next();
    				String value = (String) Parametres.get(key);
    				nameValuePairs.add(new BasicNameValuePair(key, value));
    			}
    			httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    			HttpResponse response = httpclient.execute(httppost);
     
     
    		} catch (Exception ex) {
    			if (ex == null){
    				Log.e("Exception","l'object est null");
    				return false;
    			}
    			Log.e("Exception", ex.getMessage());
    		}
    Pour information l'exception est lancé sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HttpResponse response = httpclient.execute(httppost);
    Je ne comprenais pas pourquoi lorsque j’exécutais mon programme j'avais une stacktrace d'affichée dans les logs plutôt qu'une ligne avec Exeption et le message associé.

    Il s'est avéré que le test (ex == null) ajouté dans le traitement de l'exception
    était vrai....provoquant forcément une exception NullPointerException dans le traitement même de exception....

    Quelqu'un est il au courant de ce phénomène et surtout peut il m'en donner la cause ? Par ce que je ne me sens pas vraiment de devoir tester dans chacune de mes exceptions si l'objet passé est valide ou non.

    Je continu mes recherches

    Merci d'avance.

    Cordialement.

  2. #2
    Membre éprouvé
    Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2002
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 121
    Par défaut
    Apparement un premier element de réponse....
    One possible cause is that you are trying to make a network connection on your main thread, which works fine pre-2.3.3/Honeycomb (SDK level < 10 for example) but will be thrown as an

    android.os.NetworkOnMainThreadException

    since SDK level 10.

    Check this: http://developer.android.com/referen...Exception.html

    The problem is that Eclipse doesn't really know about this exception (since it is conditionally thrown based on different SDK level so Eclipse probably can't get a correct instance of this exception, that explains why your exception object is always NULL)

    Solution: create a separate

  3. #3
    Membre éprouvé
    Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2002
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 121
    Par défaut
    Et finalement la réponse est trouvée quelque minutes apèrs avoir posté.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
    				.permitAll().build();
    		StrictMode.setThreadPolicy(policy);

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Par défaut
    Depuis les dernières versions d'Android, il est INTERDIT de lancer des requêtes HTTP depuis le thread principal (UI Thread).
    Il te faut donc lancer cette requête dans un Background Thread

  5. #5
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Mais franchement... il est INTERDIT depuis le début des smartphone et Android 1.0 de faire des traitement long (comme des accès réseaux) depuis le thread principal....
    Pour éviter les applications mal programmée, google a rajouté une vérification dans son code a partir de Android 3.0, le NetworkOnMainThread excpetion...

    L'astuce du StrictMode consiste à dire: "Je programme salement et je m'en fiche, fait tourner mon programme quand même"...



    Bon... sinon, concernant le probleme principal:

    On peut avoir le code de la classe "Parametres" ? On dirait qu'il y a un grand nombre d'accès statiques...

    Par définition on ne peut recevoir "null" dans un catch... surtout un catch (Exception ex)... puisque Java va vérifier que l'objet implémente "Exception" avant de rentrer dedans... si il hérite de Exception, c'est qu'il n'est pas null... il doit y avoir un autre probleme...

    La syntaxe d'appel de "Log" n'est pas bonne... c'est: Log.e(TAG,MESSAGE,EXCEPTION)
    donc:
    Log.e("MonTagAMoi","Erreur de processing http",ex);
    (et surtout pas de ex.getMessage())

    Et pour finir, une petite remarque concernant le code... En Java 1.5+ ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Set keys = Parametres.keySet();
    			for (Iterator i = keys.iterator(); i.hasNext();) {
    				String key = (String) i.next();
    				String value = (String) Parametres.get(key);
    				nameValuePairs.add(new BasicNameValuePair(key, value));
    			}
    s'écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for (String key : Parameters.keySet()) {
        String value = (String) Parameters.get(key);
        ...
    }

    EDIT: En fait, Parametres ressemble à une variable "Map" (si c'est une variable elle ne devrait pas commencer par une majuscule), et dans ce cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for (Map.Entry<String,String> e : Parameters.entrySet()) 
        nameValuePairs.add(new BasicNameValuePair(e.getKey(), e.getValue()));

  6. #6
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Par défaut
    "Tiens, mon système me donne une erreur ? Pas grave, on la passe sous le tapis !"

    Mais bordel, les erreurs sont pas là pour faire chier le développeur, mais là pour l'aider.

    Les choses qui ne vont pas :
    Le catch (Exception ex) : ne catch que les exceptions que tu dois traiter, pas toutes (ou utilises un système de log robuste pour ça). C'est à cause de ça que tu as ta NPE, car ton catch est trop vaste, il prend aussi le NetworkOnMainThreadException, alors qu'il ne devrait pas. Cette exception, si elle arrive, ne doit arriver que lors du développement, jamais à un autre moment.

    Tu fais un traitement long bloquant sur le thread principal, le thread graphique. Tu freezes ainsi toute ton application, sans retour utilisateur. Avec des temps pouvant aller de 2 à 30 secondes de freeze, tu peux être sûr que ton application sera désinstallée de suite.

    Hors ça, c'est une mauvaise pratique que Google demande d'éviter depuis le début. Vu que les développeurs s'en foutent, Google a créé cette erreur : NetworkOnMainThreadException, qui oblige les développeurs à paralléliser le traitement dans une tâche asynchrone.

    Par respect pour tes utilisateurs, et si tu veux que ton application ne bloque pas, oubli totalement le bout de code que tu as donné, et intéresse-toi plutôt au Thread ou à AsyncTask pour faire de ton appel réseau une tâche asynchrone.

    EDIT : et paf, grillé
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  7. #7
    Membre éprouvé
    Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2002
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 121
    Par défaut
    Citation Envoyé par Simon MARQUIS Voir le message
    Depuis les dernières versions d'Android, il est INTERDIT de lancer des requêtes HTTP depuis le thread principal (UI Thread).
    Il te faut donc lancer cette requête dans un Background Thread
    Je sais que ca fait un peu long à la détente comme réponse. Mais
    juste pour information ces traitements ne sont pas lancés depuis le Thread Principale mais a partir de public class ServiceSynchro extends Service

    Et si je ne me trompe pas cette Classe sert bien a traiter en arrière plan.
    Après il est vrai que je pourrais lancer un Thread par requête Mais normalement le Service ne doit rien bloquer de l'UI ? Non ?

    Effectivement concernant les Exceptions j’avoue j'ai tendance à ratisser large surtout en début de projet.
    Ca n'excuse en rien mes mauvaises pratiques, mais ce code était issue de mon premier projet Android, donc utilisation de Java+API Android depuis 2 jours sachant qu'à la base je développe en C++ et C# pour Windows Mobile/CE avec Visual studio 2008 dont la philosophie et les API ne sont pas exactement identiques....

    Merci encore pour vos informations.

  8. #8
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Un "Service" a les mêmes restrictions qu'une activité... mais sans "interface"
    Le sevice doit donc répondre aux "Intent" (et aux demandes de start) avec la même dilligence.

Discussions similaires

  1. [SWING] Exception bizarre avec Thread
    Par Gob4 dans le forum Débuter
    Réponses: 2
    Dernier message: 13/09/2005, 21h55
  2. Addition avec terme NULL
    Par blackfelix dans le forum Langage SQL
    Réponses: 3
    Dernier message: 22/10/2004, 08h53
  3. [Exceptions] Pb avec les exceptions
    Par joquetino dans le forum Langage
    Réponses: 11
    Dernier message: 22/09/2004, 17h08
  4. [JDBC] retour de requete sql avec valeur NULL
    Par maxxou dans le forum JDBC
    Réponses: 3
    Dernier message: 13/09/2004, 14h40
  5. Pb requete avec valeurs nulles
    Par James85 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 12/04/2004, 10h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo