Rechercher : dans
Par :

(java) cannot find symbol

Dernière réponse le 20 mai 2009 à 19:00:49 miss, le 18 mai 2009 à 16:36:12 
 Signaler ce message aux modérateurs

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

1

francis, le 18 mai 2009 à 16:46:16

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();
}
}....

Répondre à francis

2

NookZ, le 18 mai 2009 à 16:53:39

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();

Répondre à NookZ

3

sandul, le 18 mai 2009 à 16:57:37

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?

++

Répondre à sandul

4

miss, le 18 mai 2009 à 16:58:05

Je viens d'essayer vos deux solution mais cela ne marche pas, sa affiche toujours la méme erreur

Répondre à miss

5

sandul, le 18 mai 2009 à 17:00:47

[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").

++

Répondre à sandul

6

miss, le 18 mai 2009 à 17:09:45

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!!!!!

Répondre à miss

7

sandul, le 18 mai 2009 à 17:11:36
  • +1

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;
++

Répondre à sandul

8

miss, le 18 mai 2009 à 17:21:03

Merci beaucoups sandul!!!!effectivement vous avez raison,j'ai plus d'erreur!

Répondre à miss

9

sandul, le 18 mai 2009 à 17:22:20

;-)

[Ce vouvoiement finira par me tuer :p]

Répondre à sandul

10

miss, le 18 mai 2009 à 17:24:11

Lol

Répondre à miss

11

miss, le 19 mai 2009 à 12:52:06

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!

Répondre à miss

12

sandul, le 19 mai 2009 à 14:36:23

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.

++

Répondre à sandul

13

miss, le 19 mai 2009 à 18:43:26

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'

Répondre à miss

14

miss, le 19 mai 2009 à 18:59:22

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

Répondre à miss

15

Chabanus, le 19 mai 2009 à 19:01:05

Tu dois mettre Logger.getRootLogger(); a l'interieur d'un constructeur ou d'une méthode et non en dehors ! Il faut faire partie de la solution et non du problème ;-)

Répondre à Chabanus

16

sandul, le 19 mai 2009 à 19:01:21

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

Répondre à sandul

18

miss, le 19 mai 2009 à 19:29:34

C'est parce que ma classe 'lem' n'est pas dans le package 'terrier'

Répondre à miss

19

sandul, le 19 mai 2009 à 19:36:27

Tu es very very compliquée ^^

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

à plucheu

Répondre à sandul

17

sandul, le 19 mai 2009 à 19:02:46

Ah, je vois que tu as déjà répondu en partie avec ton post #14 :)
++

Répondre à sandul

20

sandul, le 19 mai 2009 à 19:40:52

Bon, il me manque des classes...

abstract public class SnowballStemmer implements TermPipeline { <==

où est-ce que je dois chopper ce truc (i.e., TermPipeline) ?

Répondre à sandul

21

miss, le 19 mai 2009 à 19:45:26

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);
}

Répondre à miss

22

sandul, le 19 mai 2009 à 19:50:10

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.

Répondre à sandul