(java) cannot find symbol

miss -  
 meryeme -
Bonjour,
j'essaye de compiler un programme java et il m'affiche l'erreur "cannot find symbol"
public class TrecTerrier {
	/** The logger used */
	public static Logger logger=Logger.getRootLogger();///////c'est cette ligne qui pose probleme
	/** The unkown option*/
	protected String unknownOption;
	/** The file to evaluation, if any */
}....

au niveau de la ligne en gras alors que j'ai bien importé "import java.util.logging.Logger;"
SVP, si quelqu'un d'entre vous pourrait m'aider, j'en ai vraiment besoin!
Configuration: Windows XP
Firefox 3.0.10

36 réponses

  • 1
  • 2
Résumé de la discussion

Le point central est l'erreur "cannot find symbol" lors de la compilation d'un programme Java, causée par une utilisation de Logger.getRootLogger() sur la ligne indiquée malgré l'importation apparente. Des réponses soulignent la confusion entre java.util.logging.Logger et la classe Logger de Log4j, ce qui rend incompatible l'appel à getRootLogger et provoque le "cannot find symbol". La solution proposée consiste soit à adopter org.apache.log4j.Logger avec le jar Log4j sur le classpath, soit à remplacer par java.util.logging.Logger et utiliser une syntaxe adaptée. En cas de doute, vérifier le type exact de Logger utilisé et s'assurer que les dépendances correspondantes sont présentes dans le projet, afin d'éviter les erreurs de compilation liées aux symboles manquants.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. sandul Messages postés 4013 Statut Membre 723
     
    Mmmm, attention à
    j'ai importé la bibliothèque log4j dans mon package
    et
    import java.util.logging.Logger;

    C'est là où le bât blesse =)

    Il faut faire
    import org.apache.log4j.Logger;
    ++
    1
  2. francis
     
    Essaie ça :

    public class TrecTerrier {
    /** The logger used */
    public static Logger logger;
    /** The unkown option*/
    protected String unknownOption;
    /** The file to evaluation, if any */

    public TrecTerrier()
    {
    logger=Logger.getRootLogger();
    }
    }....
    0
  3. NookZ Messages postés 2376 Statut Membre 514
     
    Bonjour,

    Il ne faut pas instancier l'élément dans cette partie je pense :
    public static Logger logger;

    et en mettant dans le constructeur de votre classe le
    logger=Logger.getRootLogger();
    0
  4. sandul Messages postés 4013 Statut Membre 723
     
    Salut,

    alors que j'ai bien importé "import java.util.logging.Logger;" <==
    Mais est-ce que le jar contenant cette classe est bien dans le classpath?

    ++
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. miss
     
    je viens d'essayer vos deux solution mais cela ne marche pas, sa affiche toujours la méme erreur
    0
    1. meryeme
       
      bonsoir miss,
      svp est ce que vous pouvez me donner l lien qui permet de telecharger l API: uk.ac.gla.terrier.terms
      merci .
      0
  7. sandul Messages postés 4013 Statut Membre 723
     
    [Edit] En fait, je me suis mal exprimé: est-ce que tu es sûre que "Logger" correspond bien à java.util.logging.Logger?? Car sinon, il faut rajouter le bon jar au classpath (par exemple, la bibliothèque log4j qui contient également une classe "Logger").

    ++
    0
  8. miss
     
    oui oui sandul, j'ai bien rajouté le bon jar au classpath.j'ai importé la bibliothèque log4j dans mon package
    je vois vraiment pas ou est le probléme!!!!!
    0
  9. miss
     
    merci beaucoups sandul!!!!effectivement vous avez raison,j'ai plus d'erreur!
    0
  10. sandul Messages postés 4013 Statut Membre 723
     
    ;-)

    [Ce vouvoiement finira par me tuer :p]
    0
  11. miss
     
    bonjour,
    j'ai encore la méme erreur mais avec un autre code, j'ai suivi les mémes étapes, ce qui a été fructueux pour le 1ér code mais pas pour le 2éme!
    voici l'essentiel du code

    import uk.ac.gla.terrier.terms.SnowballStemmer;
    
    
    public class lem{
        public static void lem(String s, String s1,String s2) throws Throwable{
        Class stemClass = Class.forName("org.tartarus.snowball.ext."+s+"Stemmer");
             SnowballStemmer stemmer = (SnowballStemmer)stemClass.newInstance();
             
    
    
    
    	StringBuffer input = new StringBuffer();
    
            OutputStream outstream;
    
    
                    outstream = new FileOutputStream(s2);
    
    	Writer output = new OutputStreamWriter(outstream);
    	output = new BufferedWriter(output);
    
    	int repeat = 1;
    
    
    	Object [] emptyArgs = new Object[0];
    	int character;
    	while ((character = reader.read()) != -1) {
    	    char ch = (char) character;
    	    if (Character.isWhitespace((char) ch)) {
    		if (input.length() > 0) {
    		    stemmer.setCurrent(input.toString());////ligne à probleme
    		    for (int i = repeat; i != 0; i--) {
    			stemmer.stem("");
    		    }
    		    output.write(stemmer.getCurrent());////2éme ligne à probleme
    		    output.write('\n');
    		    input.delete(0, input.length());
    		}
    	    } else {
    		input.append(Character.toLowerCase(ch));
    	    }
    	}
    	output.flush();
        }
    


    Et voici le code de la classe SnowballStemmer qui est dans le package 'terrier'

    package terrier;
    
    import org.tartarus.snowball.SnowballProgram;
    import java.lang.reflect.Method;
    import uk.ac.gla.terrier.terms.TermPipeline;
    /** 
      * @author Craig Macdonald <craigm{a.}dcs.gla.ac.uk>
      * @version $Revision: 1.2 $
      */
    abstract public class SnowballStemmer implements TermPipeline {
    	/** The actual snowball object that does the stemming */
    	protected SnowballProgram stemmer = null;
    	/** The appropriate method. Damn reflection APIs. */
    	protected Method stemMethod = null;
    	/** The next object in the term pipeline to pass stemmed terms to */
    	protected TermPipeline next = null;
    	/** The language that we're currently stemming in */
    	protected String language = null;
    
    
    	protected final static Object [] emptyArgs = new Object[0];
            private String courant;
    
    	/** Creates a new stemmer object for the language StemLanguage. 
    	  * @param StemLanguage Name of the language to generate the stemmer for. Must be a valid snowball stemmer language.
    	  * @param next The next object in the term pipeline
    	  */
    	protected SnowballStemmer(String StemLanguage, TermPipeline next)
    	{
    		StemLanguage = StemLanguage.toLowerCase();
    		try{
    			Class stemClass = Class.forName("org.tartarus.snowball.ext." + StemLanguage + "Stemmer");
    			stemmer = (SnowballProgram) stemClass.newInstance();
    			stemMethod = stemClass.getMethod("stem", new Class[0]);
    		}catch(Exception e){
    			System.err.println("ERROR: Cannot generate snowball stemmer "+StemLanguage+" : "+e);
    			e.printStackTrace();
    		}
    		language = StemLanguage;
    		this.next = next;
    	}
    
    
    	/**
    	 * Stems the given term and passes onto the next object in the term pipeline.
    	 * @param t String the term to stem.
    	 */
    	public void processTerm(String t)
    	{
    		if (t == null)
    			return;
    		next.processTerm(stem(t));
    	}
    
    	/** Stems the given term and returns the stem 
    	  * @param term the term to be stemmed.
    	  * @return the stemmed form of term */
    	public String stem(String term) {
    		stemmer.setCurrent(term);
    		/* one can only imagine why a stemmer abstract class wouldn't
    		   wouldn't have a stem() method. */
    		try{
    			stemMethod.invoke(stemmer, emptyArgs); //stemmer.stem();		
    		}catch (Exception e) {
    			System.err.println("ERROR: Cannot use snowball stemmer "+language+" : "+e);
    			e.printStackTrace();
    		}
    		return stemmer.getCurrent();
    	}
    
            public void setCurrent(String value)
            { courant=value;
            }
    
            public String getCurrent(){
                return courant;
            }
            }
    
    
       
    


    vous remarquez que les methodes "setCurrent" et "getCurrent" ont été bien définies et le 'import' est bien placé .......j'comprend pas comment il peut pas trouver le symbole!
    0
  12. sandul Messages postés 4013 Statut Membre 723
     
    Hi there,

    1. Pour la ligne
    while ((character = reader.read()) != -1) {
    : où est-ce que tu déclares l'objet reader? Pas de trace dans ton code posté...
    2. Fais attention tit chaperon rouge, comme d'habitude lorsque l'on utilise le Class.forName() il y a des dangers...

    Pour SnowballStemmer tu as le choix: org.tartarus.snowball.SnowballStemmer ou bien terrier.SnowballStemmer ? Ce choix (lorsque tu fais l'import) va se révéler capital au runtime.

    ++
    0
  13. miss
     
    merci sandul d'étre toujours là!
    bon pour étre plus claire, j'ai téléchargé le package de terrier dans le but de lemmatiser les mots avec toutes les librairies, les classes et les jar qui vont avec!
    mais pour le faire fonctionner j'ai créé la classe "lem" dont voici le code complet

    package lem;
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.OutputStreamWriter;
    import java.io.Reader;
    import java.io.Writer;
    import uk.ac.gla.terrier.terms.SnowballStemmer;
    
    
    public class lem{
        public static void lem(String s, String s1,String s2) throws Throwable{
        Class stemClass = Class.forName("org.tartarus.snowball.ext."+s+"Stemmer");
             SnowballStemmer stemmer = (SnowballStemmer)stemClass.newInstance();
             
    
    	Reader reader;
    	reader = new InputStreamReader(new FileInputStream(s1));
    	reader = new BufferedReader(reader);
    
    	StringBuffer input = new StringBuffer();
    
            OutputStream outstream;
    
    
                    outstream = new FileOutputStream(s2);
    
    	Writer output = new OutputStreamWriter(outstream);
    	output = new BufferedWriter(output);
    
    	int repeat = 1;
    
    
    	Object [] emptyArgs = new Object[0];
    	int character;
    	while ((character = reader.read()) != -1) {
    	    char ch = (char) character;
    	    if (Character.isWhitespace((char) ch)) {
    		if (input.length() > 0) {
    		    stemmer.setCurrent(input.toString());
    		    for (int i = repeat; i != 0; i--) {
    			stemmer.stem("");
    		    }
    		    output.write(stemmer.getCurrent());
    		    output.write('\n');
    		    input.delete(0, input.length());
    		}
    	    } else {
    		input.append(Character.toLowerCase(ch));
    	    }
    	}
    	output.flush();
        }
    
    
    
    
        public static void main(String[] args) throws Throwable {
            // TODO code application logic here
    //french est la langue des mots à lemmatiser parceque le package permet de le faire dans plusieurs langues
    // entree est le fichier à entrer pour la lemmatisation
    //resultat est le fichier contenant tout les mots lemmatisés
            lem("french","entree.txt","resultat.txt");
        }
    }
    
    


    et pour la classe SnowballStemmer, son code est dans le package que j'ai téléchargé, je te donne son code:

    package terrier;
    
    import org.tartarus.snowball.SnowballProgram;
    import java.lang.reflect.Method;
    import uk.ac.gla.terrier.terms.TermPipeline;
    /** 
      * @author Craig Macdonald <craigm{a.}dcs.gla.ac.uk>
      * @version $Revision: 1.2 $
      */
    abstract public class SnowballStemmer implements TermPipeline {
    	/** The actual snowball object that does the stemming */
    	protected SnowballProgram stemmer = null;
    	/** The appropriate method. Damn reflection APIs. */
    	protected Method stemMethod = null;
    	/** The next object in the term pipeline to pass stemmed terms to */
    	protected TermPipeline next = null;
    	/** The language that we're currently stemming in */
    	protected String language = null;
    
    
    	protected final static Object [] emptyArgs = new Object[0];
            private String courant;
    
    	/** Creates a new stemmer object for the language StemLanguage. 
    	  * @param StemLanguage Name of the language to generate the stemmer for. Must be a valid snowball stemmer language.
    	  * @param next The next object in the term pipeline
    	  */
    	protected SnowballStemmer(String StemLanguage, TermPipeline next)
    	{
    		StemLanguage = StemLanguage.toLowerCase();
    		try{
    			Class stemClass = Class.forName("org.tartarus.snowball.ext." + StemLanguage + "Stemmer");
    			stemmer = (SnowballProgram) stemClass.newInstance();
    			stemMethod = stemClass.getMethod("stem", new Class[0]);
    		}catch(Exception e){
    			System.err.println("ERROR: Cannot generate snowball stemmer "+StemLanguage+" : "+e);
    			e.printStackTrace();
    		}
    		language = StemLanguage;
    		this.next = next;
    	}
    
    
    	/**
    	 * Stems the given term and passes onto the next object in the term pipeline.
    	 * @param t String the term to stem.
    	 */
    	public void processTerm(String t)
    	{
    		if (t == null)
    			return;
    		next.processTerm(stem(t));
    	}
    
    	/** Stems the given term and returns the stem 
    	  * @param term the term to be stemmed.
    	  * @return the stemmed form of term */
    	public String stem(String term) {
    		stemmer.setCurrent(term);
    		/* one can only imagine why a stemmer abstract class wouldn't
    		   wouldn't have a stem() method. */
    		try{
    			stemMethod.invoke(stemmer, emptyArgs); //stemmer.stem();		
    		}catch (Exception e) {
    			System.err.println("ERROR: Cannot use snowball stemmer "+language+" : "+e);
    			e.printStackTrace();
    		}
    		return stemmer.getCurrent();
    	}
    }
    


    c'est le code de la classe tel qu'il a été défini par 'terrier'
    mais comme on doit appliquer les methodes setCurrent et getCurrent à un objet de type SnowballStemmer, j'ai jugé utile de rajouté ces 2 methodes dans cette classe comme tel:

     public void setCurrent(String value)
            { courant=value;
            }
    
            public String getCurrent(){
                return courant;
            }
    
    


    mais le probleme persiste, 'cannot find symbol'
    0
    1. meryeme
       
      bonsoir Miss, svp comment je peut telecharger l package uk.ac.gla.terrier.terms ?
      donner moi un lien svp.
      merci d'avance.
      0
  14. miss
     
    je viens d'echanger mon import "import uk.ac.gla.terrier.terms.SnowballStemmer;" contre "import terrier.SnowballStemmer;"
    c'est vrai que je n'ai plus l'erreur "cannot find symbol" mais cette fois ci c'est un probleme de runtime
    voilà ce que cela donne en output:

    Exception in thread "main" java.lang.ClassCastException: org.tartarus.snowball.ext.frenchStemmer cannot be cast to terrier.SnowballStemmer
    at lem.lem.lem(lem.java:33)
    at lem.lem.main(lem.java:79)

    à chaque fois que je veux echaper un probleme je retombe dans un autre encore pire
    0
  15. Chabanus Messages postés 982 Date d'inscription   Statut Membre Dernière intervention   70
     
    Tu dois mettre Logger.getRootLogger(); a l'interieur d'un constructeur ou d'une méthode et non en dehors !
    0
  16. sandul Messages postés 4013 Statut Membre 723
     
    Erf
    et pour la classe SnowballStemmer, son code est dans le package que j'ai téléchargé, je te donne son code: ==>

    alors pourquoi importer
    import uk.ac.gla.terrier.terms.SnowballStemmer;

    dans ta class lem?

    Sinon, euh, j'ai très faim en ce moment, faudra attendre un peu pour la suite :-p
    0
    1. miss
       
      c'est parce que ma classe 'lem' n'est pas dans le package 'terrier'
      0
      1. sandul Messages postés 4013 Statut Membre 723 > miss
         
        Tu es very very compliquée ^^

        J'essaie de voir ce qui ne va pô via création de ton projet.

        à plucheu
        0
  17. sandul Messages postés 4013 Statut Membre 723
     
    Ah, je vois que tu as déjà répondu en partie avec ton post #14 :)
    ++
    0
  18. sandul Messages postés 4013 Statut Membre 723
     
    Bon, il me manque des classes...

    abstract public class SnowballStemmer implements TermPipeline { <==

    où est-ce que je dois chopper ce truc (i.e., TermPipeline) ?
    0
    1. miss
       
      public interface TermPipeline
      {
      /**
      * Processes a term using the current term pipeline component and
      * passes the output to the next pipeline component, if the
      * term has not been discarded.
      * @param t String the term to process.
      */
      public void processTerm(String t);
      }
      0
      1. meryeme > miss
         
        bonsoir Miss,
        ewt ce que vous ouvez m'envoyer le lien qui permet de telecharger l API: uk.ac.gla.terrier.terms.
        merci
        0
  19. sandul Messages postés 4013 Statut Membre 723
     
    OK. Est-ce que tu as lu avec attention le point 2 du poste #12?

    Tu fais un import
    import terrier.SnowballStemmer;

    et essaies de créer ceci:
    Class stemClass = Class.forName("org.tartarus.snowball.ext." + s + "Stemmer");

    Normal que ça plante.
    0
  20. miss
     
    sachant que le chemin absolu vers ma classe "frenchSnowballStemmer" est:
    \terrier-2[1].1\terrier\src\uk\ac\gla\terrier\terms
    j'ai mis dans mon:
    Class stemClass = Class.forName("terrier-2[1].1.terrier.src.uk.ac.gla.terrier.terms."+s+"SnowballStemmer");
    et il dit que :
    Exception in thread "main" java.lang.ClassNotFoundException: terrier-2[1]/1/terrier/src/uk/ac/gla/terrier/terms/frenchSnowballStemmer
    at java.lang.Class.forName0(Native Method)

    je vais péter un cable!
    0
  • 1
  • 2