Menu

Problème de compréhension avec les exeptions [Résolu]

jerome38920 6 Messages postés dimanche 15 avril 2018Date d'inscription 17 avril 2018 Dernière intervention - 15 avril 2018 à 18:46 - Dernière réponse : jerome38920 6 Messages postés dimanche 15 avril 2018Date d'inscription 17 avril 2018 Dernière intervention
- 15 avril 2018 à 19:31
Bonjour,

j'ai un problème concernant les initialisation avec les utilisations des exceptions.
j'ai besoin d'utiliser un variable de type "Test t1" tout au long de ma méthode, cependant je dois l'initialiser dans un try{} catch]().
comme dans l'exemple qui suit:


Test t1;
      System.out.println("*** PREPARER UN TEST ***");
      try{
         do{             
            System.out.print("Nom du test : ");
            nomText=Clavier.lireString();
            if(nomText.length()<5 || nomText.length()>50){
               System.out.println("ERREUR ! Entrez un nom contenant entre 5 et 50 caracteres. Recommencez..."); 
            }
         }while(nomText.length()<5 || nomText.length()>50 ); // a mettre en cst globale
         t1 = new Test(nomText);                 //1er initialisation de t1
      }catch(TestInvalideException e){
         System.out.print("pas mis de nom ou c'est null :"); 
      }
      
      try{
         
          for(int i=0 ; i<nbrQuest ; i++){
             do{
               System.out.println("Enonce :");
               enonce=Clavier.lireString();
               if(enonce.length()<10 || enonce.length()>120){
                  System.out.println("ERREUR ! L'enonce doit contenir entre 10 et 120 caracteres. Recommencez..."); 
               }
            }while(enonce.length()<10 || enonce.length()>120);
            t1.ajouterQuestion(new Question("Enonce 1", 
                     new String[]{"choix1Q1", "choix2Q1", "choix3Q1"}, 1, 0));   //message d'erreur: variable t1 might not have been 
                                                                                                                          // initialized
         }
      }catch(TestInvalideException e){
         System.out.print("Nom du test :"); 
      }catch(QuestionInvalideException e){
         System.out.print("Nom du test :"); 
      }




Mon problème si situe au niveau de l'initialisation de t1, j'ai déjà initialise t1 dans mon premier try{} catch(), pourquoi est ce que je dois encore le réinitialiser dans mon second try catch?

Merci de vos réponse.
Afficher la suite 

Votre réponse

4 réponses

KX 15637 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 19 juillet 2018 Dernière intervention - 15 avril 2018 à 19:14
0
Merci
Bonjour,

Si
t1 = new Test(nomText);
provoque une exception, t1 ne sera pas initialisée.
Donc tu ne devrais pas pouvoir faire
t1.ajouterQuestion()
dans ce cas, et Java t'en empêche.
En effet ici ta première question n'ayant pas été résolue, partir sur la suite serait erroné.

Remarque : il ne faut pas perdre les exceptions.
"pas mis de nom ou c'est null :"
ne permet pas de connaître le détail de la
TestInvalideException e
que tu as catché.
Il faudrait au minimum faire un
"pas mis de nom ou c'est null :" + e
(pour bénéficier du e.toString) même si un
e.printStackTrace()
serait plus complet.
jerome38920 6 Messages postés dimanche 15 avril 2018Date d'inscription 17 avril 2018 Dernière intervention - 15 avril 2018 à 19:23
je comprend que si
t1 = new Test(nomText);
provoque une exemption, t1 ne sera pas initialisé, j'ai oublier de mettre dans cet exemple
nomText="jerome";
, et à ce moment, je suis sur que
t1 = new Test(nomText);
ne provoque pas d’exception. Cependant, il me demande toujours d'initialisé t1 dans mon second try catch.
KX 15637 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 19 juillet 2018 Dernière intervention > jerome38920 6 Messages postés dimanche 15 avril 2018Date d'inscription 17 avril 2018 Dernière intervention - 15 avril 2018 à 19:29
Le compilateur n'est pas capable de deviner que "jerome" ne provoquera pas d'exception.
Et s'il en était capable il te dirait que le try/catch est inutile et te demanderait de l'enlever.
Java voit juste que la méthode peut terminer de deux manières différentes (avec ou sans exception) et que dans un des deux cas la variable ne sera pas initialisée...
jerome38920 6 Messages postés dimanche 15 avril 2018Date d'inscription 17 avril 2018 Dernière intervention - 15 avril 2018 à 19:31
ok merci beaucoup
Commenter la réponse de KX