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

Collection et Stream Java Discussion :

Probléme de retour d'un type ArrayList dans une méthode JAVA


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de KnowPart
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2010
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2010
    Messages : 78
    Par défaut Probléme de retour d'un type ArrayList dans une méthode JAVA
    Bonjour:
    j'ai une méthode JAVA avec un type de retour ArrayList,quand je met le return dans une boucle while le j'ai une erreur qui s'affiche dans le code de type missing return statement.

    Voilà le boue de code concernant le sujet:
    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
    public ArrayList RecupFam()throws SQLException{
            ArrayList listfam=null;
            String requete;
            PreparedStatement ps = null;
            ResultSet rs = null;
            Date maj;
            String imma;
            maj=GetDatMaj();
                try{
               java.sql.Date sqlDate = new java.sql.Date(new java.util.Date().getTime());
               int year=sqlDate.getYear();
               year=year-2;
               sqlDate.setYear(year);
               requete="SELECT distinct(IMM_V_NUM_IMM)"
               +" FROM   D_ASS"
               +" WHERE  TEV_C_EVOP    LIKE '21%' "
               +"AND    TPR_C_PREST   IN ('AE','AM','AN','AR','AA') ";
                ps=conn.getConnexion().prepareStatement(requete);
                ps.setDate(1, sqlDate);
                rs=ps.executeQuery();
                while(rs.next()){
                     imma=rs.getString("IMM_V_NUM_IMM");
                     listfam=GetFamille(imma);
                     return listfam;
                 }
            catch (Exception exx){
                 System.err.println("[RecupFam-DatMaj] - [Erreur] - Erreur  de la requete!");
                 System.err.println("[RecupFam-DatMaj] - [Message] - " + exx.getMessage());}
                }
             try {
                ps.close();
             } catch (Exception exx) {}
               try {
                rs.close();
            } catch (Exception ex) {}
     
      }

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 299
    Par défaut
    Un code peu prendre plusieurs directions dans une méthode en fonction des if, while ou autrre éléments prenant des conditions en paramètre.
    Il faut que chacun de ces chemins se terminent pas un return pour que la méthode soit considérée comme valide.

    Un while n'est lu que si la condition est true.
    Tu n'as donc pas de return dans tous les chemin de ton code.

    Dans ton cas, le plus simple est de rajouter en bout du code un return null, ou alors un return new ArrayList();

    Mais à mon avis, ton code à d'autres soucis. Es-tu sûr de vouloir faire un return dans le while ?? et non pas une fois que le while est terminé ?

  3. #3
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Même sans le while, il y a un try / catch. Quand on est sorti du catch, il faut bien renvoyer quelque chose, si on ne remonte pas l'exception.

  4. #4
    Membre chevronné Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Par défaut
    Je conseille toutefois que dans chaque méthode il faut se forcer à obtenir qu' un seul return et cela doit être la dernière instruction de la méthode.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	public Object method() {
    		Object result = null;
     
    		// mon code ici
     
    		return result;
    	}
    Pour son cas, il veut retourner la première liste trouvée dans sa boucle while. Pour y arriver il suffit d'ajouter un test supplémentaire dans son while

    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
    	public List RecupFam() throws SQLException {
    		List listfam = null;
     
    		try {
    			while(rs.next() && listfam == null) {
    				imma = rs.getString("IMM_V_NUM_IMM");
    				listfam = GetFamille(imma);
    			}
     
    		} catch (Exception exx) {
    			System.err.println();
     
    		} finally {
    			try {
    				ps.close();
    			} catch (Exception exx) {}
     
    			try {
    				rs.close();
    			} catch (Exception ex) {}
    		}
     
    		return listfam;
    	}

  5. #5
    Membre confirmé Avatar de KnowPart
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2010
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2010
    Messages : 78
    Par défaut Probléme de retour d'un type ArrayList dans une méthode JAVA
    Merci pour vos réponse
    @billynirvana
    Pour son cas, il veut retourner la première liste trouvée dans sa boucle while. Pour y arriver il suffit d'ajouter un test supplémentaire dans son while
    Mon problème Je veut retourner la liste de fur et à mesure ,c'est à dire je veux ajouter des éléments à ma liste et retourner à la fois.
    Donc si je met un seul return à la fin j'aurai pas le resultats souhaité,et même si je met le test while(rs.next() && listfam == null) je n'aurai qu'un seul éléments dans ma liste retourné

  6. #6
    Membre chevronné
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2004
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2004
    Messages : 265
    Par défaut
    Citation Envoyé par KnowPart Voir le message
    Mon problème Je veut retourner la liste de fur et à mesure ,c'est à dire je veux ajouter des éléments à ma liste et retourner à la fois.
    Donc si je met un seul return à la fin j'aurai pas le resultats souhaité,et même si je met le test while(rs.next() && listfam == null) je n'aurai qu'un seul éléments dans ma liste retourné

    Une méthode ne retourne pas au "fur et à mesure", si le but et de récupérer les résultats un par un, il faut que la méthode renvoi un seul objet et l'appeler plusieurs fois...

  7. #7
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Citation Envoyé par billynirvana Voir le message
    Je conseille toutefois que dans chaque méthode il faut se forcer à obtenir qu' un seul return et cela doit être la dernière instruction de la méthode.
    Dans mon expérience, ça rend le code rapidement illisible, avec des blocs de if / else immenses pour vraiment rien.
    D'ailleurs, les classes de l'API Java ne sont pas du tout implémentées comme ça. Il suffit d'aller regarde à peu près n'importe quelle méthode equals, par exemple. Et franchement, je trouve ça tellement plus intuitif : quand on a déterminé un résultat, on sort.

  8. #8
    Membre chevronné Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Par défaut
    Citation Envoyé par Rei Ichido Voir le message
    Dans mon expérience, ça rend le code rapidement illisible, avec des blocs de if / else immenses pour vraiment rien.
    D'ailleurs, les classes de l'API Java ne sont pas du tout implémentées comme ça. Il suffit d'aller regarde à peu près n'importe quelle méthode equals, par exemple. Et franchement, je trouve ça tellement plus intuitif : quand on a déterminé un résultat, on sort.
    Si une méthode est bourrée de if then else en cascade, que le return soit fait à chaque test ou uniquement à la fin c'est illisible dans les deux cas. Ce n'est pas le return qui est en cause en fait, c'est une erreur de conception/codage. Bref on s'écarte de la question initiale.

    Pourquoi ta méthode ne retourne-t-elle pas une List<List> ? Cela pourrait éventuellement répondre à ta problématique.

    Edit: De toute façon, tant qu'on saura pas ce que retourne GetFamily on pourra pas vraiment répondre car on ne sait pas ce que contient l'ArrayList.

  9. #9
    Membre confirmé Avatar de KnowPart
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2010
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2010
    Messages : 78
    Par défaut
    Merci beaucoup pour vos réponse l'idée d'une queue m'a été très bénéfique,je l'ai implémenté et ça marche très bien,le seul problème que j'ai c'est le fait que je sais pas au préalable le taille de ma queue et par conséquent le nombre d'itération pour parcourir cette queue ,j'ai le thread qui fait la lecture depuis la queue qui se plante après la première lecture ,sachant que le premier thread fait une ecriture dans la queue par les données récupéré par une requéte SELECT, j'ai essayé de récupéré le nombre des lignes retourné par la requête, mais j'ai le ResultSet est de type TYPE_FORWARD_ONLY, donc je peux pas utiliser le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    resultat.last();
    //on récupère le numéro de la ligne
    int nombreLignes = resultat.getRow();
    Donc je suis à nouveau planté

    Vos idée sont les biens venues

  10. #10
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Le plus simple est de mettre un marqueur (pas null!) dans ta queue quand tu as fini, marqueur que tu reçois de l'autre coté et qui t'informe que plus rien n'arrivera dans la queue:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public class TransfertObjectAMoi{
      public static final TransfertObjectAMoi END_OF_QUEUE = new TransfertObjectAMoi();
     
     
      // plein de données aussi, sert à contenir le resultat d'un ROW
    }
    puis à l'ecriture quand t'es à la fin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    queue.put(TransfertObjectAMoi.END_OF_QUEUE);
    et à la lecture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    while(true){
    TransfertObjectAMoi trans = queue.take(); // jeu de mot!
    if (trans!=TransfertObjectAMoi.END_OF_QUEUE){
       // traiter la ligne
    } else {
       // a y est, fini
       break;
    }
    }

  11. #11
    Membre confirmé Avatar de KnowPart
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2010
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2010
    Messages : 78
    Par défaut
    c'est nickel ,merci bcp tchize_,sauf que j'ai fait un petit changement dans ton code en mettant à la fin du fameux queue un string à la place d'un object de la class ,car quand j'ajoute un objet il me donne erreur.
    Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    queue.put("end_queue");
    J'ai aussi un souci a propos de la taille du queue spécifié en début.
    Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    final BlockingQueue<String> queue= new ArrayBlockingQueue<String>(5);
    est ce que je peux déclarer un BlockingQueue sans spécifié sa taille.

  12. #12
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    il suffit de lire la doc http://download.oracle.com/javase/1....kingQueue.html

    pour voir que non.
    Et pour cause, sinon on risquerait de faire péter la mémoire en y stockant tout, ce qui étranglerait l'application et n'est pas le but recherché

  13. #13
    Membre chevronné Avatar de Mobius
    Profil pro
    none
    Inscrit en
    Avril 2005
    Messages
    463
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Avril 2005
    Messages : 463
    Par défaut
    Citation Envoyé par KnowPart Voir le message
    J'ai aussi un souci a propos de la taille du queue spécifié en début.
    Quel est le problème de spécifier une taille à l'initialisation de ta Queue ?

    Citation Envoyé par KnowPart Voir le message
    est ce que je peux déclarer un BlockingQueue sans spécifié sa taille.
    Si tu veux vraiment ne pas avoir à préciser de taille, tu as plusieurs solutions :
    1. Choisir une implémentation de BlockingQueue qui n'a pas de taille spécifique
      • DelayQueue : Tu as une contrainte supplémentaire qui consiste a ce que les éléments de ta queue implémente l'interface Delayed afin qu'il puisse être supprimé automatiquement au bout d'un certain temps.
      • LinkedBlockingQueue : Taille max fixé à Integer.MAX_VALUE. Tu as le temps de voir venir mais ce n'est pas impossible d'atteindre la limite.
      • SynchronousQueue : L'ajout d'un element est bloquant si la queue n'est pas vide (un peu comme si la taille était limité a 1)
    2. Créer toi même une implémentation de BlockingQueue qui n'aura pas de limite. Mais tu risque d'avoir le problème dont tchize_ parlait : si la queue ne fait que grossir, tu va saturer la mémoire et tu risque d'aller droit dans le mur.

    Personnellement, je te conseillerai l'une des deux premières implémentations si tu ne veux pas préciser de taille.
    Le choix dépend beaucoup de si tu peux te permettre de perdre les "vieux" éléments qui traîne dans la queue ou pas.

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

Discussions similaires

  1. arrayList dans une méthode recupérer dans une autre méthode
    Par toufik34 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 31/07/2013, 09h45
  2. Variable de type string dans une méthode
    Par bubblebe dans le forum Débuter
    Réponses: 6
    Dernier message: 16/08/2011, 20h34
  3. Réponses: 1
    Dernier message: 22/03/2010, 15h40
  4. Réponses: 1
    Dernier message: 18/08/2008, 14h08
  5. Réponses: 1
    Dernier message: 16/03/2007, 11h46

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