Problème de compréhension avec les exeptions

Résolu/Fermé
jerome38920 Messages postés 16 Date d'inscription dimanche 15 avril 2018 Statut Membre Dernière intervention 18 mars 2021 - Modifié le 15 avril 2018 à 18:52
jerome38920 Messages postés 16 Date d'inscription dimanche 15 avril 2018 Statut Membre Dernière intervention 18 mars 2021 - 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.

1 réponse

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
15 avril 2018 à 19:14
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.
0
jerome38920 Messages postés 16 Date d'inscription dimanche 15 avril 2018 Statut Membre Dernière intervention 18 mars 2021
Modifié le 15 avril 2018 à 19:25
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.
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019 > jerome38920 Messages postés 16 Date d'inscription dimanche 15 avril 2018 Statut Membre Dernière intervention 18 mars 2021
Modifié le 15 avril 2018 à 19:31
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...
0
jerome38920 Messages postés 16 Date d'inscription dimanche 15 avril 2018 Statut Membre Dernière intervention 18 mars 2021
15 avril 2018 à 19:31
ok merci beaucoup
0