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

  1. #1
    Nouveau membre du Club
    Inscrit en
    janvier 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : janvier 2009
    Messages : 23
    Points : 34
    Points
    34
    Par défaut Erreur "Uncaught exception java.lang.IllegalStateException" à l'appel d'une méthode
    Bonjour tout le monde,
    Depuis quelques jours que suis sur un projet j2me et basé sur des connections HTTP.

    Mon MIDLET est initialisé comme suit:

    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
     
    /**Initialise le MIDLET avec le formulaire d'accueil. */
    	public void startApp() {
     
    				mainscreen ("");
        }
     
        /**Affiche l'ecran d'accueil. */
        private void mainscreen(String msg)  {
    		form = new Form ("Connexion au DOMOBOX");
    		StringItem notifier = new StringItem ("",msg);
            form.append(login);
            form.append(password);
            form.append(notifier);
            display = Display.getDisplay(this);
     
            setCommands (form,true);
     
            display.setCurrent(form);
     
    	}
    Donc au démarrage j'ai un formulaire assez simple de login et de mot de passe.
    L'utilisateur s'authentifie si cela se passe bien, je notifie par un message 'OK' et j'initialise l'ecran suivant.
    Mais problème c'est lorsque l'on fournit pas le bon login et mot de passe, je dévrais à la base pouvoir notifier par un message "Erreur d'authentification" et rester toujours sur le même écran (login et mot de passe). Mais c'est pas le cas j'ai un bien jolie message 'Uncaught exception java/lang/IllegalStateException'

    C'est ce bout de code qui me permet de gérer tout cela :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    private void seConnecter(String u, String p)  {
    		/**Pour se connecter au serveur HTTP*/
    		HttpConnection c = null;
    		/**Réponse du serveur HTTP sous forme de flux*/
            InputStream is = null;
     
    	        try {
    	        	c = (HttpConnection)Connector.open(url+"/connect/"+u+"/"+p);
    	        	c.setRequestMethod(HttpConnection.GET);
     
    	        	DataInputStream dis = new DataInputStream (c.openInputStream());
     
    	        	/**Récupération byte par byte de la réponse du serveur*/
    	        	int ch;
     
    	        	while ((ch = dis.read()) != -1) {
     
    	        		buffer.append((char)ch);
    	        	}
     
     
    	        } catch( Exception e )
    	        {
    	            e.printStackTrace();
    	            buffer.append( "ERROR CONNECTION HTTP" );
    	        }
     
    	/**Free i/o Stream et Connection HTTP*/     
    	        finally {
    	            if (is != null) {
    	                try {
    						is.close();
    					} catch (IOException e) {
     
    						e.printStackTrace();
    					}
    	            }
     
    	            if (c != null) {
    	                try {
    						c.close();
    					} catch (IOException e) {
     
    						e.printStackTrace();
    					}
    	            }
     
    	        }
     
    	        String result = new String (buffer.toString());
     
     
    	       if ((int)result.length() == 9) {
     
    				StringItem st = new StringItem ("","OK");
    	    	   form = new Form ("Connection...");
    	    	   form.append(st);
    				setCommands (form,false);
    				display.setCurrent(form);
     
    			} else {
     
    					mainscreen("erreur d'authentification");	
    			}
    	}
     
      }
    Merci d'avance pour votre aide.

  2. #2
    Membre éprouvé
    Inscrit en
    juin 2006
    Messages
    795
    Détails du profil
    Informations forums :
    Inscription : juin 2006
    Messages : 795
    Points : 1 170
    Points
    1 170
    Par défaut
    Salut syneta

    Je suggère que tu ajoutes un try catch dans ta fonction mainscreen().
    Tu pourrais ajouter une variable de débug que tu incrémentes à chaque ligne et affiche dans ton catch pour savoir précisément quelle ligne a généré l'erreur.

    Plus généralement, tu devrais mettre des try catch partout avec un petit message qui indique dans quel parti du code l'exception a été levée.

  3. #3
    Nouveau membre du Club
    Inscrit en
    janvier 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : janvier 2009
    Messages : 23
    Points : 34
    Points
    34
    Par défaut
    Salut Aniki,
    Merci pour ta réponse, effectivement j'ai saturé de try/catch ma fonction mainscreen et cela semble résoudre le problème à un certain niveau. Le souci c'est que j'essaie de faire une instruction dans le genre form.append d'une variable nulle (login, password). J'ai donc amélioré la fonction en tant que telle :

    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
     
    /**Affiche l'ecran d'accueil. */
        private void mainscreen(String msg)  {
        	form = new Form ("Connexion au DOMOBOX");
    		StringItem notifier = new StringItem ("",msg);
    		login = new TextField("Nom d'utilisateur :", "", 20, TextField.ANY);
    		password = new TextField("Mot de passe :", "", 20, TextField.PASSWORD);
     
    	/** Léve l'exception FORM.APPEND d'une valeur nulle*/
    		try {
    			form.append(login);
    			form.append(password);
    		} catch (IllegalStateException e) {
    			//return;
    		}
    		form.append(notifier);
            display = Display.getDisplay(this);
            setCommands (form,true);
            display.setCurrent(form);	
    	}
    Mais voila quand j'entre volontairement le mauvais login et mot de passe à la première tentative, je reste coincer sur l'écran login et mot de passe, et l'application réagit plus et aucun traitement n'est plus effectué. J'ai quand même la notification de l'erreur que je voulais.
    Alors que le but rechercher c'est de donner à l'utilisateur l'occasion de retenter le saisi, jusqu'à ce qu'il entre le bon login et mot de passe.
    Mais quand à la première tentative j'entre le bon login et mot de passe, tout se passe bien, mon écran suivant est affiché. Merci encore.
    Pour la méthode debug incrémente j'ai pas bien saisi l'idée, mais je cogite encore la dessus.
    Images attachées Images attachées  

  4. #4
    Membre éprouvé
    Inscrit en
    juin 2006
    Messages
    795
    Détails du profil
    Informations forums :
    Inscription : juin 2006
    Messages : 795
    Points : 1 170
    Points
    1 170
    Par défaut
    Tu devrais rajouter des Debug.Print (je ne me rappelle plus la syntaxe exacte en J2ME, mais on se comprend) un peu partout pour savoir où tu en es dans ton code.
    Ca te permettra de savoir quelle est la fonction qui bloque. À partir de là, tu pourras réflechir à comment éviter ça.

  5. #5
    Nouveau membre du Club
    Inscrit en
    janvier 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : janvier 2009
    Messages : 23
    Points : 34
    Points
    34
    Par défaut
    Merci,
    Bon je m'y met pour voir ce que cela donne.

  6. #6
    Nouveau membre du Club
    Inscrit en
    janvier 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : janvier 2009
    Messages : 23
    Points : 34
    Points
    34
    Par défaut
    Effectivement Aniki merci, cela marche parfaitement. J'ai pu déceler les erreurs et surmonter ça. Merci encore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        static final void DEBUG(String s) {
            if (true) {
                System.out.println("DEBUG : "+s);
            }
        }

  7. #7
    Membre éprouvé
    Inscrit en
    juin 2006
    Messages
    795
    Détails du profil
    Informations forums :
    Inscription : juin 2006
    Messages : 795
    Points : 1 170
    Points
    1 170
    Par défaut
    Content de voir que tu as pu résoudre ton problème !
    Surtout que là, tu n'as pas seulement appris comment résoudre ce problème spécifique, mais comment potentiellement résoudre tout tes problèmes.

    Au passage, si je ne me trompe pas, cette discussion devrait aussi être résolue, non ?

    Par curiosité (et pour les gens qui pourraient avoir le même problème), quel était le problème et comment l'as-tu résolu ?

  8. #8
    Nouveau membre du Club
    Inscrit en
    janvier 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : janvier 2009
    Messages : 23
    Points : 34
    Points
    34
    Par défaut
    Bonjour Aniki,
    J'avais deux soucis majeurs :
    1) Ma fonction était susceptible de soulever des exceptions, et j'avais pas prévu des traitement pour cela. Notamment ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    form.append(login);
    form.append(password
    Pour le résoudre :
    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
    26
    27
     
    /**Affiche l'ecran d'accueil. */
        private void mainscreen(String msg)  {
     
        	form = new Form ("Connexion au DOMOBOX");
    		StringItem notifier = new StringItem ("",msg);
    		login = new TextField("Nom d'utilisateur :", "", 20, TextField.ANY);
    		password = new TextField("Mot de passe :", "", 20, TextField.PASSWORD);
     
    	/** Léve l'exception FORM.APPEND d'une valeur nulle */
    		try {
    			form.append(login);
    			form.append(password);
    		} catch (IllegalStateException e) {
    			e.printStackTrace();
    		} finally {
    			if (login == null && password == null) {
    				login = new TextField("Nom d'utilisateur :", "", 20, TextField.ANY);
    				password = new TextField("Mot de passe :", "", 20, TextField.PASSWORD);
    			}
    		}
     
    		form.append(notifier);
            display = Display.getDisplay(this);
            setCommands (form,true);
            display.setCurrent(form);
    	}
    2) Réponse de la requête HTTP pour faire des traitements la dessus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    buffer = new StringBuffer();
    Me récupère la réponse du serveur en chaînes de caractère lors de la tentative d'authentification, mais le souci il récupérait tout ce qu'il trouvait de passage (Du moins il récupère plus que moi je vois). En faite le souci, c'est que j'ai laissé mon objet flux d'entrée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dis = new DataInputStream (c.openInputStream());
    resté ouvert tout le temps (tant que l'appli est démarré), mais une simple instruction mon souci est résolu. C'est ce qui faisait que je resté figé sur l'écran d'accueil car le test conditionnel sur la réponse du serveur été érroné.
    Voici le code :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    /**
             * Permet de s'authentifier par HTTP.
             * @param u username
             * @param p password
             * */
    	private void seConnecter(String u, String p)  {
    		/** Pour se connecter au serveur HTTP. */
    		HttpConnection c = null;
     
    		/** Réponse du serveur HTTP sous forme de flux. */
            InputStream is = null;
            DataInputStream dis = null;
            buffer = new StringBuffer();
     
    	        try {
    	        	c = (HttpConnection)Connector.open(url+"/connect/"+u+"/"+p);
    	        	c.setRequestMethod(HttpConnection.GET);
     
    	        	dis = new DataInputStream (c.openInputStream());
     
    	        	/**Récupération byte par byte de la réponse du serveur. */
    	        	int ch;
    	        	while ((ch = dis.read()) != -1) {
    	        		buffer.append((char)ch);
    	        	}
     
    	        } catch( Exception e )
    	        {
    	            e.printStackTrace();
    	            buffer.append( "ERROR CONNECTION HTTP" );
    	        }
     
    	/**Free i/o Stream et Connection HTTP*/     
    	        finally {
    	        	if (dis != null) {
    	                try {
    						dis.close();
    					} catch (IOException e) {
     
    						e.printStackTrace();
    					}
    	            }
    	            if (is != null) {
    	                try {
    						is.close();
    					} catch (IOException e) {
     
    						e.printStackTrace();
    					}
    	            }
     
    	            if (c != null) {
    	                try {
    						c.close();
    					} catch (IOException e) {
     
    						e.printStackTrace();
    					}
    	            }
     
    	        }
    J’espère que cela aidera un jour.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 08/04/2013, 08h26
  2. L'exception : java.lang.IllegalStateException
    Par nadhir84 dans le forum JSF
    Réponses: 1
    Dernier message: 19/07/2011, 09h00
  3. l'exception : java.lang.IllegalStateException:
    Par moha_alnif dans le forum JSF
    Réponses: 10
    Dernier message: 10/07/2009, 12h06
  4. Erreur exception java.lang.NullPointerException
    Par geol99 dans le forum Langage
    Réponses: 2
    Dernier message: 14/06/2007, 20h24

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