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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 51
    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 expérimenté

    Inscrit en
    Octobre 2009
    Messages
    133
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 133
    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 averti
    Inscrit en
    Juin 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 51
    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 expérimenté

    Inscrit en
    Octobre 2009
    Messages
    133
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 133
    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 averti
    Inscrit en
    Juin 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 51
    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.

  6. #6
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 51
    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


  7. #7
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 51
    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!

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    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é).

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, 00h04
  2. utiliser des classes C++ en delphi
    Par Guigui_ dans le forum Delphi
    Réponses: 6
    Dernier message: 07/07/2006, 10h29
  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, 08h13
  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, 16h05

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