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 sur collection


Sujet :

Android

  1. #1
    Membre éprouvé Avatar de Christophe Charron
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    927
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 927
    Par défaut Exception sur collection
    Bonjour,

    je débute totalement en java et j'ai un souci pour intercepter une exception sur une collection inexistante. Je voudrais donc savoir si je procède correctement.

    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
    import android.net.*;
    import java.lang.Exception;
    // Retourne le nombre d'octets téléchargés par l'application
    public static String DonneTraficTéléchargement(){
    	String result;
    	try{
    		TrafficStats tStats = new TrafficStats();
    		result = Long.toString(tStats.getUidRxBytes(android.os.Process.myUid()));
    		if (result.equals("-1")){
    			return "0";
    		}
    		else{
    			return result;
    		}
    	} 
    	catch(Exception e) {
    		return "0";
    	} 
    }
    TrafficStats n'étant apparue qu'en version 2.3 d'Androïd, je plante légitimement en faisant un test sur Androïd 2.1 update.
    Mais je plante bestialement !! Je voudrais trapper l'erreur et passer outre(ne pas sortir brutalement.

    D'avance, merci pour vos éclaircissements.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    - "Exception sur collection" ? C'est censé vouloir dire quelque chose ?

    - Ici le problème est que tu essaies d'utiliser une classe qui n'existe pas dans ta version de Java. En chargeant ta classe il doit d'abord charger la classe TrafficStats, qui n'existe pas, donc le chargement de ta classe échoue.
    Si la classe ne se charge pas, il n'y a pas la moindre chance d'appeler sa méthode DonneTraficTéléchargement()*, et donc ce n'est pas d'entourer ça de try / catch qui va résoudre quoi que ce soit.

    Je ne sais pas pour Android, mais en Java classique, la solution c'est la réflexivité. Plutôt que d'utiliser au compile-time la classe TrafficStats, chercher si elle existe au runtime.
    Utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Class<?> trafficStatClass = Class.forName("android.net.TrafficStats")
    pour vérifier si elle existe et si oui, mettre la main sur sa Class.
    À partir de là, je suppose que tu sais lire la JavaDoc de Class et que tu as pas besoin que je t'explique ce que ça fait.

    Ensuite tu récupères par réflexivité la méthode à appeler sur cette classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Method uidRxBytesMethod = trafficStatClass.getMethod("getUidRxBytes", Integer.TYPE);
    puis tu appelles cette méthode. Elle est statique, donc on peut donner null à la place de l'instance sur laquelle l'appliquer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uidRxBytesMethod.invoke(null, uid);
    Ce qui renvoie un objet Long, qui, si j'ai bien compris, vaudra -1 si l'opération n'est pas gérée.

    Bien sûr, plusieurs choses peuvent échouer en tentant de faire ça, notamment la classe TrafficStats qui n'existe pas. Du coup c'est effectivement une bonne idée d'entourer tout ça de try / catch, cette fois-ci, puisque le bloc try sera parcouru, ça marchera.

    * au fait, un nom de méthode devrait commencer par une minuscule. Question d'usage et de compatibilité avec les systèmes à introspection. (Et je conseille pas spécialement de mettre des accents, mais je suppose que ça c'est pour l'exemple.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 679
    Par défaut
    Détecter se genre d'exception est assez sale.

    Je ne connais pas le SDK d'android mais il doit forcément y avoir une méthode pour récupérer le numéro de version et ne pas utiliser cette fonctionnalité le cas échéant.
    Ça serait beaucoup plus propre.

  4. #4
    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
    Je trouve ca très propre, c'est de la pure reflexivité....

    Class<?> trafficStatClass = Class.forName("android.net.TrafficStats");

    lancera une exception si la classe n'est pas disponible... basta...
    apres, les autres exceptions ne devraient pas être catchées....

  5. #5
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 679
    Par défaut
    Ma réponse était destinée à "Christophe Charron" pas à "thelvin". Nos réponses se sont croisées.
    La méthode de thelvin est en effet bonne, bien que j'essaie d'éviter au maximum l'utilisation de l'introspection.

  6. #6
    Membre éprouvé Avatar de Christophe Charron
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    927
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 927
    Par défaut
    Bonjour,

    pardon pour ma réponse tardive, par rapport à ta hâtive solution.
    C'est exactement ce que je cherchais. Je lève bien une exception si la classe n'existe pas, exception que je traite.


    Citation Envoyé par thelvin Voir le message
    - "Exception sur collection" ? C'est censé vouloir dire quelque chose ?

    - Ici le problème est que tu essaies d'utiliser une classe qui n'existe pas dans ta version de Java. En chargeant ta classe il doit d'abord charger la classe TrafficStats, qui n'existe pas, donc le chargement de ta classe échoue.
    Si la classe ne se charge pas, il n'y a pas la moindre chance d'appeler sa méthode DonneTraficTéléchargement()*, et donc ce n'est pas d'entourer ça de try / catch qui va résoudre quoi que ce soit.

    Je ne sais pas pour Android, mais en Java classique, la solution c'est la réflexivité. Plutôt que d'utiliser au compile-time la classe TrafficStats, chercher si elle existe au runtime.
    Utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Class<?> trafficStatClass = Class.forName("android.net.TrafficStats")
    pour vérifier si elle existe et si oui, mettre la main sur sa Class.
    À partir de là, je suppose que tu sais lire la JavaDoc de Class et que tu as pas besoin que je t'explique ce que ça fait.

    Ensuite tu récupères par réflexivité la méthode à appeler sur cette classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Method uidRxBytesMethod = trafficStatClass.getMethod("getUidRxBytes", Integer.TYPE);
    puis tu appelles cette méthode. Elle est statique, donc on peut donner null à la place de l'instance sur laquelle l'appliquer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uidRxBytesMethod.invoke(null, uid);
    Ce qui renvoie un objet Long, qui, si j'ai bien compris, vaudra -1 si l'opération n'est pas gérée.

    Bien sûr, plusieurs choses peuvent échouer en tentant de faire ça, notamment la classe TrafficStats qui n'existe pas. Du coup c'est effectivement une bonne idée d'entourer tout ça de try / catch, cette fois-ci, puisque le bloc try sera parcouru, ça marchera.

    * au fait, un nom de méthode devrait commencer par une minuscule. Question d'usage et de compatibilité avec les systèmes à introspection. (Et je conseille pas spécialement de mettre des accents, mais je suppose que ça c'est pour l'exemple.)

  7. #7
    Membre éprouvé Avatar de Christophe Charron
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    927
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 927
    Par défaut
    Bonjour,

    pour ma culture personnelle, en quoi lever une exception est-il plus "propre" que tester les multiples versions ? Je considère ce choix plus comme un mode de programmation plus générique, non ?

    Citation Envoyé par Uther Voir le message
    Ma réponse était destinée à "Christophe Charron" pas à "thelvin". Nos réponses se sont croisées.
    La méthode de thelvin est en effet bonne, bien que j'essaie d'éviter au maximum l'utilisation de l'introspection.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Exception sur Collections.sort(Vector v)
    Par anadoncamille dans le forum Général Java
    Réponses: 2
    Dernier message: 20/11/2012, 14h50
  2. Réponses: 5
    Dernier message: 07/07/2005, 10h20
  3. [vb.net] exception sur monForm.Show
    Par graphicsxp dans le forum Windows Forms
    Réponses: 2
    Dernier message: 04/07/2005, 12h27
  4. Exception sur Java Web Start
    Par Le Bressan dans le forum JWS
    Réponses: 5
    Dernier message: 01/02/2005, 10h52
  5. [Tomcat] Exception sur JSP
    Par Malaussene dans le forum Tomcat et TomEE
    Réponses: 7
    Dernier message: 10/09/2004, 08h43

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