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 :

Utiliser des classes d'un package exérieur


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 51
    Points : 20
    Points
    20
    Par défaut Utiliser des classes d'un package exérieur
    Bonjour,

    Je suis entrain de me prendre la tête sur un truc qui me semblait tout bête, mais je ne trouve pas la solution tout seul.

    En fait j'ai un programme tout simple, dans lequel je veux utiliser une classe venant d'un package extérieur que j'ai téléchargé d'internet (abc4j).

    J'ai téléchargé le fichier .jar contenant un tas de classes dont celle que je veux utiliser en particulier : TuneBook. J'ai mis ce JAR dans le fichier "lib" de mon workspace sous Eclipse.

    Dans Eclipse, j'ai ajouté le fichier JAR au build path, ça marche sans problème. Les paquets ont l'air de bien être importés. En tout cas pas d'erreur à la compil'.

    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
    import java.util.*;
    import java.io.*;
    import abc.notation.*;
    import abc.parser.TuneBook;
    
    public class ABC {
    	public static void main(String[] arg) {
    
    		System.out.println( "jus' checkin' ..." );
    		File abcFile = new File ("/Users/nicolas/Desktop/Harmonisation/ABC/tutorialsong.abc");
    	    
            // does the file exist
            if ( abcFile.exists() )
                {
                System.out.println( "file exists" );
                }
            
            //TuneBook book = new TuneBook(abcFile);
    	    //int tunesNb = book.size();
    	    //System.out.println("Nb of tunes in tutorialsong.abc : " + tunesNb);
    	    // now retrieve the tune with reference number "10"
    	    //Tune aTune = book.getTune(10);
    	    // display its title
    	    //System.out.print("Title n°10 is " + aTune.getTitles());
    	    // and the name of its composer.
    	    //System.out.println(" and has been composed by " + aTune.getComposer());
    	}
    }
    Néanmoins dès que je rajoute la ligne en gras, j'ai une erreur :

    Exception in thread "main" java.lang.Error: Unresolved compilation problem:
    Unhandled exception type FileNotFoundException

    at ABC.main(ABC.java:20)

    Je pense que la classe TuneBook n'est pas trouvée....

    Je ne comprends pas.

    Désolé si ce message devait être posé dans la section "Eclipse", je n'en étais pas sûr.

    Merci de votre aide, je ne sais plus trop quoi faire...

  2. #2
    Membre actif

    Inscrit en
    Octobre 2009
    Messages
    133
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 133
    Points : 295
    Points
    295
    Par défaut
    Ton erreur indique plutôt que tu ne gères pas correctement une exception dans ton main.
    Ajoutes un throws Exception pour ton main, cela devrait résoudre le problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static void main(String [] args) throws Exception {
    Après, si tu cherches a utiliser ce code dans un contexte plus important, il te plus utile d'utiliser un try...catch pour gérer cette exception au plus près dans l'application.

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 51
    Points : 20
    Points
    20
    Par défaut
    Merci henolivier, votre méthode semble fonctionner.

    Néanmoins je ne suis pas sûr de comprendre pourquoi l'erreur se produit, et encore moins pourquoi Eclipse la repère AVANT que j'aie compilé...


    L'exception en question semble indiquer qu'il ne trouve pas un fichier, non? Comment savoir lequel?

    J'ai pour l'instant modifier le main en rajoutant "throws exception", en quoi cela pourrait-il être embêtant dans la suite?

    Car en effet je compte bien utiliser ce code dans un contexte plus important...

  4. #4
    Membre actif

    Inscrit en
    Octobre 2009
    Messages
    133
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 133
    Points : 295
    Points
    295
    Par défaut
    L'exception en question semble indiquer qu'il ne trouve pas un fichier, non? Comment savoir lequel?
    L'exception ici n'est pas qu'il ne trouve pas le fichier mais qu'il peut y avoir une exception de lancé de type FileNotFoundException et que celle-ci n'est pas gérée dans ton application.
    Le fait de mettre throws Exception dans ta méthode main fait que toutes les exceptions lancées dans ta méthode seront directement relevées au niveau supérieur et donc tu n'as pas besoin de la traiter dans ta méthode.

    J'ai pour l'instant modifier le main en rajoutant "throws exception", en quoi cela pourrait-il être embêtant dans la suite?
    En fait, il n'y a rien de spécialement embêtant, mais plutôt une norme de programmation de manière a faciliter le développement en cas de problème.
    Utiliser un try ... catch pour gérer tes exceptions va te permettre de savoir quand un problème se trouve (a l'endroit exact de ton application) et de réagir en conséquence (par exemple, tu peux faire un catch de l'exception car le fichier n'existe pas et ton traitement ne sera pas d'arrêter la mais de créer le fichier pour l'utiliser).
    Ceci va surtout te permettre de gérer les problèmes de chaque partie de l'application a l'endroit ou le problème peut se rencontrer et non en toute fin de chaîne.
    Tu devrais regarder des tutoriaux pour expliquer la raison de la gestion des exceptions sous Java pour te faire une idée de la raison de les utiliser.

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 51
    Points : 20
    Points
    20
    Par défaut
    J'essaie d'avancer pour voir d'oû vient cette satanée exception

    Voilà le code que je mets en place :

    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
     
    	public static void main(String[] arg) {
     
    		System.out.println( "jus' checkin' ..." );
     
    		File abcFile = new File ("/Users/nicolasbarascud/Desktop/Harmonisation/ABC/tutorialsong.abc");
     
            // does the file exist
            if ( abcFile.exists() )
                {
                System.out.println( "file exists" );
                }
     
            try {
            	  FileInputStream fis = new FileInputStream(abcFile);
            	  System.out.println("ça marche, on continue le traitement...");
            	  //suite du traitement
            	} catch (Exception e) { //ou FileNotFoundException, mais avec Exception on est sûr de tout catcher
            	  System.err.println("zut ça marche pas : " + e.getMessage());
            	  e.printStackTrace();
            	}

    Et voilà ce que me sort la console :

    jus' checkin' ...
    file exists
    ça marche, on continue le traitement...
    pourtant quand j'enlève le try catch, j'ai une Exception du type FileNotFoundException qui apparait autour du FileInputStream.

    Grr!

  6. #6
    Membre éprouvé Avatar de Jidefix
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    742
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    Points : 1 154
    Points
    1 154
    Par défaut
    Bonjour,
    tout d'abord, Eclipse ne repère pas "avant de compiler": il compile au fur et à mesure que tu sauvegardes ton fichier, et t'indique donc les erreurs de compilation au fur et à mesure. Il s'agit ici bien d'une erreur de compilation.

    l'erreur de compilation est due au fait que la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FileInputStream fis = new FileInputStream(abcFile);
    est susceptible de générer une exception de type "FileNotFound" lors de l'exécution, par exemple si le dossier ABC n'existe pas. Ca ne veut pas dire que tel ou tel fichier n'existe pas, ça veut dire qu'au moment de l'exécution du programme, cette ligne pourrait partir en erreur si le fichier n'existe pas

    Cependant en java tu es OBLIGE de gérer les exceptions, soit en rajoutant dans la signature de ta fonction
    ce que tu as fait,
    soit en entourant la ligne en question d'un try/catch:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    try{
    File abcFile = new File ("/Users/nicolas/Desktop/Harmonisation/ABC/tutorialsong.abc");
    }
    catch(FileNotFoundException e){
    // Ici on met du code qui gère l'exception d'une manière ou d'une autre (en créant le dossier, en quittant le programme avec une erreur, le choix t'appartient)
    }
    En règle générale, c'est une très mauvaise pratique de déclarer un throws dans une méthode main.
    En effet, le "throws" signifie grosso modo "Je ne suis pas capable de traiter cette exception, je vais donc partir en erreur et la transmettre à la méthode qui m'a appellée".
    Or dans le cas du main, comme c'est le point d'entrée du programme, à priori personne ne l'a appellée. L'erreur va donc remonter jusqu'en haut ton programme va partir en erreur "bêtement" (c'est à dire, sans message d'erreur approprié).

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 51
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par henolivier Voir le message
    L'exception ici n'est pas qu'il ne trouve pas le fichier mais qu'il peut y avoir une exception de lancé de type FileNotFoundException et que celle-ci n'est pas gérée dans ton application.
    Le fait de mettre throws Exception dans ta méthode main fait que toutes les exceptions lancées dans ta méthode seront directement relevées au niveau supérieur et donc tu n'as pas besoin de la traiter dans ta méthode.


    En fait, il n'y a rien de spécialement embêtant, mais plutôt une norme de programmation de manière a faciliter le développement en cas de problème.
    Utiliser un try ... catch pour gérer tes exceptions va te permettre de savoir quand un problème se trouve (a l'endroit exact de ton application) et de réagir en conséquence (par exemple, tu peux faire un catch de l'exception car le fichier n'existe pas et ton traitement ne sera pas d'arrêter la mais de créer le fichier pour l'utiliser).
    Ceci va surtout te permettre de gérer les problèmes de chaque partie de l'application a l'endroit ou le problème peut se rencontrer et non en toute fin de chaîne.
    Tu devrais regarder des tutoriaux pour expliquer la raison de la gestion des exceptions sous Java pour te faire une idée de la raison de les utiliser.
    Nos posts se sont croisés.

    Merci beaucoup pour cette réponse.

    J'essaye alors d'implémenter un try..catch plutôt. C'est un bon exercice de toute façon. Y'a-t-il une erreur dans mon code ci-dessus?

    EDIT : c'est bon, je crois que j'ai compris!!!

    Merci pour vos 2 réponses, c'est génial.

  8. #8
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 51
    Points : 20
    Points
    20
    Par défaut
    Juste encore un précision :

    Si comme l'a suggéré Jidefix, je rajoute :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    try{
    File abcFile = new File ("/Users/nicolas/Desktop/Harmonisation/ABC/tutorialsong.abc");
    }
    catch(FileNotFoundException e){
    // Ici on met du code qui gère l'exception d'une manière ou d'une autre (en créant le dossier, en quittant le programme avec une erreur, le choix t'appartient)
    System.out.println("Fichier .abc non trouvé");
    System.exit(0);
    }
    Cette fois

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            if ( abcFile.exists() )
                {
                System.out.println( "file exists" );
                }
    me dit que abcFile cannot be resolved


  9. #9
    Membre actif

    Inscrit en
    Octobre 2009
    Messages
    133
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 133
    Points : 295
    Points
    295
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    try{
    File abcFile = new File ("/Users/nicolas/Desktop/Harmonisation/ABC/tutorialsong.abc");
    }
    catch(FileNotFoundException e){
    // Ici on met du code qui gère l'exception d'une manière ou d'une autre (en créant le dossier, en quittant le programme avec une erreur, le choix t'appartient)
    System.out.println("Fichier .abc non trouvé");
    System.exit(0);
    }
    Oui, ton try ... catch marche comme une méthode a part, tu ne peux pas utiliser un attribut déclaré dans ce bloc en dehors de celui-ci (comme les autres bloc for, if, ...)
    Tu dois donc le sortir pour que cela fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    File abcFile = null;
    try{
    abcFile = new File ("/Users/nicolas/Desktop/Harmonisation/ABC/tutorialsong.abc");
    }
    catch(FileNotFoundException e){
    // Ici on met du code qui gère l'exception d'une manière ou d'une autre (en créant le dossier, en quittant le programme avec une erreur, le choix t'appartient)
    System.out.println("Fichier .abc non trouvé");
    System.exit(0);
    }
    Deuxième point, sachant que tu sors si le fichier n'est pas trouvé (System.exit(0)), tu n'as donc pas besoin de vérifier s'il existe ou non car sinon tu sortirais (tu n'as donc pas a mettre le if ( abcFile.exists() )).

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    C'est parce que tu as déclaré abcFile dans un bloc (ici, un bloc try). Tu as deux solutions : soit tu déclares abcFile en dehors du bloc, soit tu inclus le abcFile.exists() dans le bloc également.

    En gros, voici les deux solutions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    File abcFile = null;
    try {
      abcFile = new File(...);
    } catch (FileNotFoundException e) {
      ...
      System.exit(1);
    }
    assert abcFile != null; // on a déclaré abcFile null, mais on lui a d'office assigné une valeur dans le try. comme le catch fait quitter, abcFile doit être différent de null.
    if (abcFile.exists()) {
      ...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    try {
      File abcFile = new File(...);
      if (abcFile.exists()) {
        ..
      }
    } catch (FileNotFoundException e) {
      ...
      System.exit(1);
    }

  11. #11
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 51
    Points : 20
    Points
    20
    Par défaut
    (Réponse à Henolivier)

    D'accord pour le exists(), c'est un reste de mon ancien code...

    Ca ne marche plus du tout du coup...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    		File abcFile = null;
     
    		try{
    			abcFile = new File ("/Users/nicolas/Desktop/Harmonisation/ABC/tutorialsong.abc");
    			}
    		catch(FileNotFoundException e){
    			// Ici on met du code qui gère l'exception d'une manière ou d'une autre (en créant le dossier, en quittant le programme avec une erreur, le choix t'appartient)
    			System.out.println("Fichier .abc non trouvé");
    			System.exit(0);
    			}
     
            TuneBook book = new TuneBook(abcFile);
    J'ai une erreur sur le catch(FileNotFoundException e)

    Unreachable catch block for FileNotFoundException. This exception is never thrown from the try statement body
    et sur le TuneBook book = new TuneBook(abcFile);

    Unhandled exception type FileNotFoundException


    Est-ce que ça veut dire que mon try.. catch est au mauvais endroit?

    Je ne comprends pas, ça veut dire qu'il faut gérer les exceptions à chaque fois que je fais appel à abcFile?

    Mais là on a déjà "géré" le cas où il ne trouve pas de fichier abcFile...

  12. #12
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 51
    Points : 20
    Points
    20
    Par défaut
    (réponse à dingoth)

    Je n'arrive pas à faire fonctionner votre code non plus...

    En fait si je déclare abcFile = null, je n'ai plus d'exception FileNotFound (ce qui me paraît logique). Du coup le try.. catch n'a plus lieu d'être, si?

  13. #13
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 51
    Points : 20
    Points
    20
    Par défaut
    Autre question : ne pourrait-on pas régler définitivement ce problème en demandant au programme de nous faire choisir un fichier dans l'explorateur? Et sinon System.exit(0)?

  14. #14
    Membre éprouvé Avatar de Jidefix
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    742
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    Points : 1 154
    Points
    1 154
    Par défaut
    Dans l'ordre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Unreachable catch block for FileNotFoundException. This exception is never thrown from the try statement body
    Signifie que le code à l'intérieur de ton Try ne lancera jamais l'exception FileNotFound, donc il est inutile de le catcher (donc le compilo ne marche pas, faut pas déconner avec le compilo)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Unhandled exception type FileNotFoundException
    est toujours ta bonne vieille erreur.

    Ce que l'on peut déduire de tout ça est que le "new File" n'a pas besoin d'être en try/catch, en revanche le "new TuneBook", si!

    Pour répondre à ta dernière question, oui on peut facilement faire ça avec la classe JFileChooser:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    JFileChooser jfc = new JFileChooser();
          int result = jfc.showOpenDialog(this);
          if(result == JFileChooser.CANCEL_OPTION){
             //Si tu rentre là c'est que l'utilisateur a cliqué sur annuler. Tu peux soit redemander soit fermer le programme
          }
             File file = jfc.getSelectedFile(); //Récupère l'objet File fourni par l'utilisateur
    C'est plus flexible que de mettre le nom du fichier dans le code mais ça ne règlera pas le problème!

Discussions similaires

  1. Récupérer la liste des classes d'un package
    Par Coulon Arnaud dans le forum Général Java
    Réponses: 20
    Dernier message: 30/12/2010, 01h04
  2. utiliser des classes C++ en delphi
    Par Guigui_ dans le forum Delphi
    Réponses: 6
    Dernier message: 07/07/2006, 11h29
  3. [Applet]utiliser une classe d'un package dans une applet
    Par jeromejanson dans le forum Applets
    Réponses: 1
    Dernier message: 30/06/2005, 09h13
  4. utiliser des classes dont on n'a pas le source
    Par kocin dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 28/08/2004, 17h05

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