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

avec Java Discussion :

erreur "missing return statement"


Sujet :

avec Java

  1. #1
    Membre régulier
    Inscrit en
    Mars 2009
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 167
    Points : 76
    Points
    76
    Par défaut erreur "missing return statement"
    Bonjour à tous,

    Je désire faire une méthode permettant de décomposer un nombre en 2 nombres premiers. Le problème, c'est que j'ai une erreur "missing return statement", pourtant la méthode retourne {-1,-1} , si on ne peut pas décomposer le nombre, et elle retourne {nb1, nb2}, si on peut faire la décomposition, et 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
    public static int[] decomposition(int n){
     
           int div=2;
           int[] erreur={-1,-1};
           if(testPrimalite(n))
                 return erreur;
           else
           {     //return erreur;
     
           while(div<Math.sqrt(n)){
           if(n%div==0){ // Si j'ai trouvé mon diviseur!
                  if(testPrimalite(n/div) && testPrimalite(div)){
                       //Les deux diviseurs sont ils premiers?
                          int[] res={n/div,div};
                          return res;
                      //OUI, on les retourne
                     } else return erreur;
                     //NON, on retourne une erreur
           }else if(div==2)//Si le diviseur est 2, on passe à 3
                 div++;
           else
                 div+=2;//Sinon on incrémente de deux en deux
           }
           }
    }
    Merci d'avance

  2. #2
    Membre éprouvé
    Avatar de michel.di
    Homme Profil pro
    Freelance
    Inscrit en
    Juin 2009
    Messages
    782
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 782
    Points : 1 042
    Points
    1 042
    Par défaut
    Salut,

    tes deux if :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    else if(div==2)//Si le diviseur est 2, on passe à 3
                 div++;
           else
                 div+=2;//Sinon on incrémente de deux en deux
           }
    n'ont pas de return!
    Docteur en informatique
    Freelance R&D, Web
    Activité freelance : https://redinnov.fr
    Page perso : https://michel-dirix.com/

  3. #3
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    bonjour,

    Ton problème vient du fait que tes différent return sont conditionné (if). Il manque donc un ou des cas de return.
    Par exemple si tu sors du while en passant par une condition qui ne fais pas de return tu ne retourne rien !!

    Quand tu as donc un "missing return statement", cela veux simplement dire que tu n'as pas traité tous les cas de retrurn.
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    j'ai pas lu l'algo mais si tu estimes qu'il est tel qu'on doive passer logiquement par tes return alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while(letest) {
    }
    throw new AssertionError("on ne devrait pas passer par là!") ;
    par ailleurs renvoyer une erreur par {-1, -1} ne me semble pas très politiquement correct : une exception ne serait-elle pas bienvenue?
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

  5. #5
    Membre régulier
    Inscrit en
    Mars 2009
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 167
    Points : 76
    Points
    76
    Par défaut
    Je vous remercie pour vos aides, j'ai essayé de modifier le code, je n'ai pas maintenant d'erreur, mais le problème, c'est que lorsque j'ai essayé d'appeler cette méthode dans le main, l'exécution du programme ne se termine pas et n'affiche rien. 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
    public class programmePrincipal {
     
     
        public static void main(String[] args) {
        int a = 15;
        //System.out.println("le nombre choisi = " + nb);
        int[] r = decomposition(a);
        System.out.println("La décomposition de "+a+" est " + r);
         }
     
    public static boolean testPrimalite(int nb){return testPrim(nb,2);}
    /*
    Le test de primalite récursif
    */
    public static boolean testPrim(int nb,int div){
          if(nb<2) //Cas rare pour eviter les valeurs négatives
              return false;
          if(nb%div==0) //On a trouvé un diviseur, donc le nombre n'est pas premier
              return false;
          else if(div==2) //Si le diviseur est 2, on passe à 3
               return testPrim(nb,3);
          else if(div<Math.sqrt(nb)) //Sinon on incrémente de deux en deux
               return testPrim(nb,div+2);
          else return true;
    }
     
     /*Permet de decomposer un nombre en produit de deux entiers*/
    ////////////////////////////////
    ///////////////////////////////
    public static int[] decomposition(int n){
         int div=2;
         int[] erreur={-1,-1};
         int[] res={};
         if(testPrimalite(n)) return erreur;
         while(div<Math.sqrt(n)){
             if(n%div==0){ // Si j'ai trouvé mon diviseur!
                    if(testPrimalite(n/div) && testPrimalite(div)){//Les deux diviseurs sont ils premiers?
                             int[] ress={n/div,div};
                             res=ress;
                             //return res;
                             //OUI, on les retourne
                    } else //return erreur;
                        res=erreur;
                    //NON, on retourne une erreur
             }else
                     if(div==2)//Si le diviseur est 2, on passe à 3
                            div++;
                     else
                            div+=2;//Sinon on incrémente de deux en deux
    }
         return res;
    }
    }
    Merci d'avance

  6. #6
    Membre régulier
    Inscrit en
    Mars 2009
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 167
    Points : 76
    Points
    76
    Par défaut
    J'ai modifié le code une autre fois, le voici :
    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
    public class mainnn {
     
        public static void main(String[] args) {
        int a = 35;
        //System.out.println("le nombre choisi = " + nb);
        int[] r = decomposition(a);
        System.out.println("La décomposition est " + r);
         }
     
    public static boolean testPrimalite(int nb){return testPrim(nb,2);}
    /*
    Le test de primalite récursif
    */
    public static boolean testPrim(int nb,int div){
          if(nb<2) //Cas rare pour eviter les valeurs négatives
              return false;
          if(nb%div==0) //On a trouvé un diviseur, donc le nombre n'est pas premier
              return false;
          else if(div==2) //Si le diviseur est 2, on passe à 3
               return testPrim(nb,3);
          else if(div<Math.sqrt(nb)) //Sinon on incrémente de deux en deux
               return testPrim(nb,div+2);
          else return true;
    }
     
     /*Permet de decomposer un nombre en produit de deux entiers*/
    ////////////////////////////////
    ///////////////////////////////
    public static int[] decomposition(int n){
         int div=2;
         int[] erreur={-1,-1};
         int[] res={};
         if(testPrimalite(n)) return erreur;
         while(div<Math.sqrt(n)){
             if(n%div==0){ // Si j'ai trouvé mon diviseur!
                    if(testPrimalite(n/div) && testPrimalite(div)){//Les deux diviseurs sont ils premiers?
                             int[] ress={n/div,div};
                             res=ress;
                             return res;
                             //OUI, on les retourne
                    } else return erreur;
                        //res=erreur;
                    //NON, on retourne une erreur
             }else
                     if(div==2)//Si le diviseur est 2, on passe à 3
                            div++;
                     else
                            div+=2;//Sinon on incrémente de deux en deux
    }
         return res;
    }
    }
    lé résultat de la décomposition en facteurs premiers normalement elle doit afficher les facteurs premiers, mais le résultat trouvé quelque soit l'entier à décomposer est égale à [I@10b62c9
    j'ai besoin d'un coup de main et merci d'avance

  7. #7
    Membre chevronné
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Points : 2 011
    Points
    2 011
    Par défaut
    salut

    Remplace :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System.out.println("La décomposition est " + r);
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System.out.println("La décomposition est " + Arrays.toString(r));
    Le problème est que la méthode toString() appelée lors du System.out.println n'est pas redéfinie pour les tableaux d'où la nécessité de passer par une méthode utilitaire.

    -"Tout ça me paraît très mal organisé. Je veux déposer une réclamation. Je paye mes impôts, après tout!"
    -"JE SUIS LA MORT, PAS LES IMPÔTS! MOI, JE N'ARRIVE QU'UNE FOIS".

    Pieds d'argile (1996), Terry Pratchett 1948 - 2015
    (trad. Patrick Couton)

  8. #8
    Membre régulier
    Inscrit en
    Mars 2009
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 167
    Points : 76
    Points
    76
    Par défaut
    Je vous remercie pour l'aide.

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

Discussions similaires

  1. [Débutant] Erreur "missing return statement"
    Par cherche_java dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 21/01/2015, 00h25
  2. Erreur "missing return statement"
    Par Arketran dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 02/10/2011, 12h02
  3. Missing return statement et autres joyeusetés
    Par Invité dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 20/02/2011, 13h47
  4. Classes abstraites et 'missing return statement'
    Par popy67 dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 28/12/2010, 22h29
  5. missing return statement
    Par Zozzio dans le forum Langage
    Réponses: 2
    Dernier message: 04/01/2008, 23h00

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