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

Langage Java Discussion :

Probleme de try - catch


Sujet :

Langage Java

  1. #1
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 342
    Points : 107
    Points
    107
    Par défaut Probleme de try - catch
    Bonjour,

    J ai un probleme avec les boucles try - catch. Deja, j avoue que ce n'est pas clair dutout dans ma tete ce truc, donc tout bon tutorial sera le bienvenue. Et notamment je ne c pas quel catch attribuer a une boucle try. Comment sais t on quels catch doit on mettre ?

    Sinon, plus concretement j ai ce bout de code ou je dois lire un fichier et donner la somme de tout les nombres:


    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
     System.out.println("-3- We read the data from a file on the CEG website called testdouble.dat.");
            System.out.println("WARNING : The data contains a stream of binary encoded doubles. (We used a DataInputStream)");
            try
            {
                FileInputStream fis = new FileInputStream("C:\\Documents and Settings\\Lulu\\testdouble.dat");
                BufferedInputStream bis = new BufferedInputStream(fis);
                DataInputStream dis = new DataInputStream(bis);
     
                double d = dis.readDouble();
     
                double total = 0;
                while(! EOF)
                //while(d != null)
                {
                    total = total + d;
                    System.out.println(d + " total actuel : " + total);
                    d = dis.readDouble();
                }
     
                dis.close();
            }
     
            //cath the errors 
     
            catch(java.io.EOFException jie)
            {
                EOF = true;
            }
            catch(IOException io){
                System.out.println(io.getMessage());
                io.printStackTrace();
            }
     
            catch(Exception e){
                System.out.println(e.getMessage());
                e.printStackTrace();
            }
    Mes problemes sont en fait :

    1) Je ne vois pas comment faire pour qu'il me donne la valeur de la somme qu'une foi toute la lecture effectué. Car je ne peux pas mettre l'affichage de la somme (total) en dehors de la boucle while car quand il rencontre une exception il quitte la boucle try (si j ai bien compris :p).

    2) Quel est la difference entre :
    et ?

    3) comme j'ai dis au debut, j ai mis c'est catch plus ou moins au pif, comment sais t on exactement quel catch on doit inserer svp?

    Merci de votre aide, car j avoue que la je coince

  2. #2
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 638
    Points
    7 638
    Par défaut Re: Probleme de try - catch
    Citation Envoyé par Slumpy
    1) Je ne vois pas comment faire pour qu'il me donne la valeur de la somme qu'une foi toute la lecture effectué. Car je ne peux pas mettre l'affichage de la somme (total) en dehors de la boucle while car quand il rencontre une exception il quitte la boucle try (si j ai bien compris :p).
    Je ne vois pas où est le problème. Si il rencontre une exception, c'est qu'il y a eu un problème, donc que ça a foiré, donc que ton résultat risque d'être faux.
    Met l'affichage à la sortie de ton while.


    Citation Envoyé par Slumpy
    2) Quel est la difference entre :
    Code:
    while(! EOF)
    et
    Code:
    while(d != null)
    ?
    C'est quoi ce EOF? Jamais utilisé en Java....
    d est la dernière lecture dans ton fichier. Si il s'agit de la fin du fichier, il n'y a plus rien à lire, donc ta variable d sera à null (par opposition à "si il y a quelque chose à lire, alors d prendra cette valeur-là").


    Citation Envoyé par Slumpy
    3) comme j'ai dis au debut, j ai mis c'est catch plus ou moins au pif, comment sais t on exactement quel catch on doit inserer svp?
    Ouahou, de la programmation à larache! Cool!

    Alors, quand on essaye de programmer, on consulte un minimum la documentation du langage que l'on utilise. Pour Java, ça s'appelle la Javadoc.

    Quand tu prends la Javadoc, que tu vas voir par exemple la classe FileInputStream, tu lis:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    FileInputStream
     
    public FileInputStream(File file)
                    throws FileNotFoundException
    En gros, ce constructeur est susceptible de lancer une exception de type FileNotFoundException en cas de problème. C'est celle-ci que tu dois intercepter dans ton catch pour la traiter (ou plus si affinité).

    Il faut savoir que tu peux traiter toutes les exceptions, sans préciser le type, en faisant un:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    catch(Exception e){ ... }
    comme tu as fait à la fin de ton code, mais alors le traitement sera le même quelque soit l'exception. Donc si tu veux un traitement spécifique pour un type d'exception, il faut utiliser un catch spécifique.

    Il va te falloir parcourir ton code pour repérer toutes les méthodes qui peuvent renvoyer un exception, et les traiter.

    Les EDI "modernes" sont un bon outil pour cela, ils te signalent toutes les exception non "catchées".
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  3. #3
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 342
    Points : 107
    Points
    107
    Par défaut
    Coucou,

    merci d essayer de m aider.

    Je ne vois pas où est le problème. Si il rencontre une exception, c'est qu'il y a eu un problème, donc que ça a foiré, donc que ton résultat risque d'être faux. Met l'affichage à la sortie de ton while.
    Si je fais ca :
    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
    try
            {
                FileInputStream fis = new FileInputStream("C:\\Documents and Settings\\Slumpy\\Mes documents\\Euroaquae\\Newcastle\\SVY333 - Java\\Data for Practical 4\\testdouble.dat");
                BufferedInputStream bis = new BufferedInputStream(fis);
                DataInputStream dis = new DataInputStream(bis);
     
                double d = dis.readDouble();
     
                double total = 0;
                while(! EOF)
                //while(d != null)
                {
                    total = total + d;
                    System.out.println(d);
                    d = dis.readDouble();
                }
                System.out.println(total);
                dis.close();
            }
     
            //cath the errors 
     
            catch(java.io.EOFException jie)
            {
                EOF = true;
            }
            catch(IOException io){
                System.out.println(io.getMessage());
                io.printStackTrace();
            }
     
            catch(Exception e){
                System.out.println(e.getMessage());
                e.printStackTrace();
            }
    Il ne va jamais lire la ligne ou est ecris de m afficher le total
    Ce n est pas forcement qu il y a un probleme si il rencontre une exception non ? Dans mon cas, si j ai bien compris c juste car il est en fin de fichier.



    C'est quoi ce EOF? Jamais utilisé en Java....
    d est la dernière lecture dans ton fichier. Si il s'agit de la fin du fichier, il n'y a plus rien à lire, donc ta variable d sera à null (par opposition à "si il y a quelque chose à lire, alors d prendra cette valeur-là").
    Desolé de pas avoir expliqué, EOF c un booleen que je declare egal a false au depart. quel est la difference entre c des lignes stp ? (celle avec null et le test sur le booleen ?)


    Ouahou, de la programmation à larache! Cool!
    Oui pour l instant les cach, c a l arrache total

    Mettre : catch(Exception e){
    System.out.println(e.getMessage());
    e.printStackTrace();
    }[/code]

    Englobe toutes les erreurs ? donc dans mon code les exceptions sont redondantes non ?

  4. #4
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 638
    Points
    7 638
    Par défaut
    Citation Envoyé par Slumpy
    Il ne va jamais lire la ligne ou est ecris de m afficher le total
    Ce n est pas forcement qu il y a un probleme si il rencontre une exception non ? Dans mon cas, si j ai bien compris c juste car il est en fin de fichier.
    Une exception sert à signaler un problème d'exécution, à signaler que l'action n'a pas été menée de manière optimale.
    Si tu croises une exception dans ton cas, c'est qu'il y a eu un problème. Avoir une exception en fin de fichier alors que tu gères justement la fin de fichier dans ton while, ça veut dire que tu as un gros problème! (voir la suite pour ça)
    En supposant que ta fin de fichier est gérée correctement, le programme sort alors du while, et exécute le System.out.println, et t'affiche le résultat du traitement.

    Citation Envoyé par Slumpy
    Desolé de pas avoir expliqué, EOF c un booleen que je declare egal a false au depart.
    Et ensuite?
    Il y a un moment où il est sensé passer à true? Pas dans ton while en tous cas... ah ok, dans l'exception... pas bon ça... c'est un peu comme si tu roulais en voiture, que tu sais qu'il faut que tu freines pour éviter l'arbre, et que tu attendes de percuter l'arbre pour te mettre à freiner...

    Citation Envoyé par Slumpy
    quel est la difference entre c des lignes stp ? (celle avec null et le test sur le booleen ?)
    Il n'y en a pas, dans le principe, ça fait la même chose.
    Sauf que dans ton prog, tu ne gères pas la fin de fichier avec ton EOF, vu que tu ne le modifies qu'en cas d'exception... donc en dehors de la boucle du traitement...
    Utilise le traitement de fin de fichier est directe, pas besoin d'autre manipulation...

    Citation Envoyé par Slumpy
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Mettre : catch(Exception e){
                System.out.println(e.getMessage());
                e.printStackTrace();
            }
    Englobe toutes les erreurs ? donc dans mon code les exceptions sont redondantes non ?[/code]
    Oui, ça t'englobe toutes les exceptions, car toutes les exceptions particulières étendent la classe Exception (sauf évidemment, l'exception qui confirmera la règle...)
    Non, elles ne sont pas redondantes, si tu veux traiter chaque exception de manière particulière.
    Par exemple, pour une FileNotFoundException, tu voudras peut-être créer le fichier... pour une IOException, afficher un message... pour une NullPointerException créer l'objet... et laisser une Exception en final pour toutes les exceptions que tu ne veux pas gérer de manière individuelle...
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  5. #5
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 342
    Points : 107
    Points
    107
    Par défaut
    Oui, ça t'englobe toutes les exceptions, car toutes les exceptions particulières étendent la classe Exception (sauf évidemment, l'exception qui confirmera la règle...)
    Non, elles ne sont pas redondantes, si tu veux traiter chaque exception de manière particulière.
    Par exemple, pour une FileNotFoundException, tu voudras peut-être créer le fichier... pour une IOException, afficher un message... pour une NullPointerException créer l'objet... et laisser une Exception en final pour toutes les exceptions que tu ne veux pas gérer de manière individuelle...
    Ha oki, c'est un peu plus clair ca maintenant, merci.


    Je ne peux pas utiliser ca dans mon cas, car d est un double

  6. #6
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 638
    Points
    7 638
    Par défaut
    Citation Envoyé par Slumpy
    [
    Je ne peux pas utiliser ca dans mon cas, car d est un double
    c'est surtout parce que readDouble() te lance une exception que ça craint...

    Dans ce cas, encadre la ligne
    avec un try... catch, dans le genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    try {
        d = dis.readDouble();
    } catch {IOException) {
        EOF=true;
    }
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  7. #7
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 342
    Points : 107
    Points
    107
    Par défaut resolu
    Merci de m aider voisin. (J habite a 25 Km de toulouse :p Si il faut t mon voisin, c con quand meme ).


    En tout cas, j avoue que j ai du mal avec ces catch . Je vais mettre resolu dans le titre et essayer de digerer ca.

    Si jamais je reposerais sur ce message.

    Encore merci a toi ^^

  8. #8
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 638
    Points
    7 638
    Par défaut Re: resolu
    Citation Envoyé par Slumpy
    (J habite a 25 Km de toulouse :p Si il faut t mon voisin, c con quand meme ).
    Ben alors baisse les basses de ta chaine hifi alors!
    Non, sérieusement, je ne suis pas si loin de la capitale. Blagnac pour être précis.

    Citation Envoyé par Slumpy
    En tout cas, j avoue que j ai du mal avec ces catch . Je vais mettre resolu dans le titre et essayer de digerer ca.
    Les catch sont très simples à digérer... une fois qu'on a compris le truc.
    Pour imager, simplement, ton code aura cette allure:
    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
     
    try {
        une méthode qui lance une exception1
        une méthode qui lance une exception2
        une méthode qui lance une exception3
     
        try {
            une méthode qui lance une exception4
        } catch (exception4 e) {
            je gère l'Exception 4 (genre e.printStackTrace())
        }
     
    } catch (exception1) {
        je gère l'exception1
    } catch (Exception) {
       je gère toute les exceptions qui n'ont pas été gérées précédemment
        (donc, ici, l'exception2 et l'exception 3)
    }
    Après, c'est toi qui te gère les catch là où tu préfères, soit tous ensemble à la fin, soit au plus près de la méthode qui est sensée lancer l'exception (ça dépend de l'algo, de l'exception, ...)

    Citation Envoyé par Slumpy
    Si jamais je reposerais sur ce message.
    Il vaudrait sans doute mieux faire un autre post, un nouveau. Le "futur" problème potentiel ne sera pas forcément directement en rapport. A la limite tu fais référence à ce post, pour servir de base...
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  9. #9
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 342
    Points : 107
    Points
    107
    Par défaut
    Ben alors baisse les basses de ta chaine hifi alors!
    Non, sérieusement, je ne suis pas si loin de la capitale. Blagnac pour être précis.
    Woaw excuses, je baisse ca dessuite :p
    Héhé, suis un peu plus au sud moi :p, du coté Ramonville-Castanet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Les catch sont très simples à digérer... une fois qu'on a compris le truc.
    Quand on ne connait que le fortran, cette notion est un peu etrange :p
    Mais effectivement ca commence a venir.

    Ptite question : Faut il essayer de catcher chaqu'une des exceptions ou pas ? J entend par la, essayer de laisser le moins de possibilité pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    atch (Exception) {
       je gère toute les exceptions qui n'ont pas été gérées précédemment
        (donc, ici, l'exception2 et l'exception 3)
    Parce que dans mon cas si j ai compris quelque chose, je dois :

    -Pour FileInputStream :
    catch FileNotFoundException,
    catch SecurityException,

    -Pour BufferedInputStream :
    rien

    -Pour DataInputStream :
    rien

    - Pour mon premier readDouble :
    catch EOFException,
    catch IOException

    - Pour mon deuxieme readDouble contenu dans la deuxieme boucle try :
    remettre les deux catch precedent

    -Pour close()
    catch IOException :

    Et mettre : catch(Exception e){ pour traiter toutes les autres ?


    Autre point :
    quand on veut creer une exception qui n'existe pas , style probleme si le nombre n est pas pair, doit on creer une class pour l exception, et l appeler par try-catch dans le code ?

    Car j ai vu des classes declarées avec throws, et throw new Nom de l exception quand elle se produit. Quelque chose comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void affecter(int j, int m, int a) throws DateNonConforme {
        ...
        if (m >= 1 && m <= 12) this.mois = m;
        else throw new DateNonConforme(" mois " + m);
        ...
    Mais je ne comprends pas la difference avec une boucle try catch ...

    Desolé de faire le boulet avec mes questions ...[/quote]

  10. #10
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 638
    Points
    7 638
    Par défaut
    Citation Envoyé par Slumpy
    Ptite question : Faut il essayer de catcher chaqu'une des exceptions ou pas ? J entend par la, essayer de laisser le moins de possibilité pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    atch (Exception) {
       je gère toute les exceptions qui n'ont pas été gérées précédemment
        (donc, ici, l'exception2 et l'exception 3)
    C'est toi qui voit, en fonction de ce quoi faire le programme!
    Au départ, tu peux tout laisser gérer par un catch (Exception), avec juste un affichage du "stackTrace". Puis petit à petit, au fur et à mesure que tu développes ta classe, tu ajoutes des fonctionalités à la gestion d'exception pour gérer plus en détail les exceptions.
    Par exemple, pour le FileNotFoundException, au départ tu fais un catch (Exception e), avec un e.printStackTrace en gestion, juste histoire de dire qu'il y a eu un problème (et que tu t'en fous si l'utilisateur est un boulet et à choisit un fichier qui n'existe pas...). Par la suite, tu peux faire brancher sur une classe qui va créer le fichier, pour régler le problème...
    En gros, je ne sais trop quoi te conseiller... Java permet de lever des exceptions en cas de problème, après c'est à toi de voir comment tu veux les gérer... à la louche, ou en détail...


    Citation Envoyé par Slumpy
    Autre point :
    quand on veut creer une exception qui n'existe pas , style probleme si le nombre n est pas pair, doit on creer une class pour l exception, et l appeler par try-catch dans le code ?
    Tu peux. Tu créés une classe OddNumberException (ou NombreImpairException si tu veux la faire à la française!), qui étends la classe Exception.
    Atttention, les exceptions servent en général à faire remonter l'information comme quoi il y a eu un problème. Exemple, tu appelles une méthode, et quelque chose foire dans cette méthode. Le problème n'est pas géré par la méthode que tu as appelé, mais par la partie du programme qui l'a appelé (ou même en amont si tu fais propager l'exception). L'exception sert juste à transmettre l'information qu'il y a eu un problème, et quel type de problème.

    Citation Envoyé par Slumpy
    Mais je ne comprends pas la difference avec une boucle try catch ...
    Throw: crée et lance l'exception
    Try... catch: intercepte et traite l'exception.

    Pour imager, au tennis, "throw", c'est l'arbitre de ligne, et "try... catch", c'est l'arbitre de chaise. L'arbitre de ligne va gueuler pour dire que la balle est dehors, et son boulot s'arrête là... et l'arbitre de chaise va dire "la balle est faute, donc 30-0 pour lui, balle suivante, on continue".
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

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

Discussions similaires

  1. probleme avec try et catch
    Par salsero1 dans le forum Struts 1
    Réponses: 2
    Dernier message: 15/11/2007, 08h02
  2. Probleme de try catch
    Par Seb33300 dans le forum Visual C++
    Réponses: 5
    Dernier message: 16/06/2007, 00h00
  3. probleme de try catch
    Par alexlecool dans le forum VB.NET
    Réponses: 3
    Dernier message: 19/04/2007, 16h54
  4. probleme try catch, Exception
    Par Slumpy dans le forum VB.NET
    Réponses: 9
    Dernier message: 23/03/2007, 15h51
  5. [Débutant] Petit probleme try catch
    Par Terminator dans le forum Langage
    Réponses: 16
    Dernier message: 30/06/2005, 13h21

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