Erreur de compilation Java "cannot find symbol" sous ubuntu 9.04

mickeynad Messages postés 18 Date d'inscription dimanche 6 décembre 2009 Statut Membre Dernière intervention 15 juillet 2010 - 6 déc. 2009 à 18:15
mickeynad Messages postés 18 Date d'inscription dimanche 6 décembre 2009 Statut Membre Dernière intervention 15 juillet 2010 - 7 déc. 2009 à 17:16
Bonjour à tous,

J'en appelle à votre aide. J'ai fait un petit logiciel en java de gestion des pièces automobiles qui est constitué de 6 classes (héritage simple):
-une classe abstraite Piece (classe mère);
-Deux classes qui sont une extension de la classe Piece:
*PieceDeBase;
*PieceComposite (classe abstraite);
-Deux classes qui sont une extension de la classe PieceComposite:
*PieceCompositeEnKit;
*PieceAssemblee;
-Une classe MainPiece qui est une application de toutes ces 5 classes.

Les 6 classes sont dans le meme répertoire Pieces.

Lorsque je compile la super classe Piece, tout va bien, j'ai aucune erreur. Par contre, lorsque je compile les sous classes, j'ai une erreur du genre:


PieceDeBase.java:7: cannot find symbol
symbol: class Piece
public class PieceDeBase extends Piece
^
PieceDeBase.java:37: cannot find symbol
symbol : variable super
location: class Prog.Pieces.PieceDeBase
{return super.toString()+"-de base-";}


Ce sont les seules erreurs que j'ai pour toutes mes classes.

Voici ma classe Piece:

package Prog.Pieces;

import java.util.*;
import java.io.*;

public abstract class Piece
{
//Attributs----------------------------------------------------------------------------------

 protected String nom;
 protected String referenceDeBase;

//Constructeurs------------------------------------------------------------------------------
 
Piece()
  {nom="inconnu"; referenceDeBase="000000";}
 
Piece(String n, String r)
  {nom=n; referenceDeBase=r;}

//Accesseurs---------------------------------------------------------------------------------
public String getNom() {return nom;}
public void setNom(String n) {nom=n;}

public String getReferenceDeBase() {return referenceDeBase;}
public void setReferenceDeBase(String r) {referenceDeBase=r;}

//Autres methodes----------------------------------------------------------------------------

public String toString()
{return nom+" "+getReferenceDeBase();}

abstract public float prix();

abstract public float dureeGarantie();

abstract public float dureeFabrication();

abstract public String prefixe();

public String referenceDeBase() {return referenceDeBase;}

public void affiche()
  {
   System.out.println("Nom : "+getNom()+"\n"+
                      "Reference : "+referenceDeBase()+"\n"+
                      "Prix : "+prix()+"euro(s)\n"+
                      "Garantie : "+dureeGarantie()+"mois\n"+
                      "Duree de fabrication : "+dureeFabrication()+"jour(s)\n");
  }

//Partie protegee----------------------------------------------------------------------------

protected String afficheCommeComposants(int decalage)
  {
   String Decale="";
   for (int i=0; i<decalage; i++)
   Decale +="    ";
   return Decale+nom+" - "+referenceDeBase()+"\n";
  }

}









Et voici ma classe PieceDeBase (pour ne vous citer que celles la):

package Prog.Pieces;

import java.util.*;
import java.io.*;

public class PieceDeBase extends Piece
{
//Attributs-----------------------------------------------------------------

 private float prix;
 private float dureeGarantie;
 private float dureeFabrication;

//Constructeurs-------------------------------------------------------------

 PieceDeBase()
 {prix=0; dureeGarantie=0; dureeFabrication=0;}

 PieceDeBase(String n, String r, float p, float dg, float df)
  {super(n,r); prix=p; dureeGarantie=dg; dureeFabrication=df;}

//Accesseurs----------------------------------------------------------------
 
 public float getPrix() {return prix;}
 public void setPrix(float p) {prix=p;}
 
 public float getDureeGarantie() {return dureeGarantie;}
 public void setDureeGarantie(float dg) {dureeGarantie=dg;}

 public float getDureeFabrication() {return dureeFabrication;}
 public void setDureeFabrication(float df) {dureeFabrication=df;}

//Autres methodes-----------------------------------------------------------
 
 public String toString()
   {return super.toString()+"-de base-";}

 public float prix() {return prix;}
 
 public float dureeGarantie() {return dureeGarantie;}

 public float dureeFabrication() {return dureeFabrication;}

 public String prefixe() {return "00"+super.reference();}

}





Est-ce une erreur de mon classpath ou de mon code?
Je comprends vraiment rien, mon code me semblait juste pourtant.
Si vous pouviez m'aider, je vous en serais très reconnaissante.
Cordialement.

10 réponses

kirua12 Messages postés 1155 Date d'inscription samedi 17 janvier 2004 Statut Membre Dernière intervention 29 avril 2011 7
7 déc. 2009 à 12:31
Salut,

comment sont nommées tes dossiers ? avec une majuscule Prog et Pieces ? ou prog et piece ?
0
mickeynad Messages postés 18 Date d'inscription dimanche 6 décembre 2009 Statut Membre Dernière intervention 15 juillet 2010
7 déc. 2009 à 13:38
Salut Kirua12,

Avec des majuscules Prog et Pieces.
J'ai remarqué aussi que lorsque je retire de mes sous classes ceci:

package Prog.Pieces;


je n'ai plus aucune erreur de compilation et j'arrive à exécuter parfaitement mes sous classes (quand bien même je compile parfaitement la super classe Piece avec ou sans le package Prog.Pieces)

Peut être que ce n'est finalement pas nécessaire que je remette le nom du package dans mes sous classes étant donné qu'elles utilisent la super classe qui contient déjà le nom du package, non?

Merci encore.
0
kirua12 Messages postés 1155 Date d'inscription samedi 17 janvier 2004 Statut Membre Dernière intervention 29 avril 2011 7
7 déc. 2009 à 14:42
Il vaut mieux que chaque classe soit dans un package. Et il n'y a pas d'héritage de package entre classes.

Tes sous classes sont bien dans un répertoire ../Prog/Pieces/ ?
0
mickeynad Messages postés 18 Date d'inscription dimanche 6 décembre 2009 Statut Membre Dernière intervention 15 juillet 2010
7 déc. 2009 à 14:58
Oui toutes mes classes sont dans Desktop/Java/Prog/Pieces/

Un problème de Classpath peut être?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
kirua12 Messages postés 1155 Date d'inscription samedi 17 janvier 2004 Statut Membre Dernière intervention 29 avril 2011 7
7 déc. 2009 à 15:01
il y a de fortes chances.
Comment tu compiles ?
0
mickeynad Messages postés 18 Date d'inscription dimanche 6 décembre 2009 Statut Membre Dernière intervention 15 juillet 2010
7 déc. 2009 à 15:04
Alors pour compiler je me mets dans dans le dossier Pieces (qui contient mes classes) à travers le terminal puis je tape:

javac PieceDeBase.java
0
kirua12 Messages postés 1155 Date d'inscription samedi 17 janvier 2004 Statut Membre Dernière intervention 29 avril 2011 7
7 déc. 2009 à 15:51
ben il est là le pb.
Tu dois être dans Desktop/Java et faire
javac -cp .:autreLibs.jar Prog/Pieces/*.java


T'utilises pas un IDE pour développer et compiler ? ça serait plus simple
0
mickeynad Messages postés 18 Date d'inscription dimanche 6 décembre 2009 Statut Membre Dernière intervention 15 juillet 2010
7 déc. 2009 à 16:09
Je viens d'essayer ce que tu m'as dit, à savoir me mettre dans le répertoire Java puis taper la commande ci-dessus mais ça m'affiche exactement les mêmes erreurs qu'avec ce que je faisais avant:

PieceDeBase.java:7: cannot find symbol
symbol: class Piece
public class PieceDeBase extends Piece
^
PieceDeBase.java:37: cannot find symbol
symbol : variable super
location: class Prog.Pieces.PieceDeBase
{return super.toString()+"-de base-";}


En fait je suis débutante et à la fac, on nous appris à compiler qu'avec le terminal. Je me suis initiée à Eclipse toute seule et lorsque j'ai compilé avec Eclipse, ça m'a affiché comme erreur que le nom du package n'est pas celui attendu, c'est pour ça que je l'ai supprimé et l'ai gardé que dans la classe mère.

Une question, en supposant que tous mes dossiers .java sont dans le répertoire Desktop/Java, comment devrai-je déclarer le classpath?
Moi j'ai mis dans mon fichier bashrc:

export CLASSPATH=${HOME}/Java:.


C'est ce qu'on nous a appris à la fac. Est ce que c'est ça?

Merci pour ton aide encore une fois.
0
kirua12 Messages postés 1155 Date d'inscription samedi 17 janvier 2004 Statut Membre Dernière intervention 29 avril 2011 7
7 déc. 2009 à 17:01
Le classpath semble bon.

Pour les packages, ils doivent avoir la même structure que les dossiers. Si tu as une classe dans le package Prog.Pieces (enfin prog.pieces aurait été plus correct vis-à-vis des conventions de nommage standard), le fichier java doit avoir le même nom que la classe et doit être dans un dossier Prog/Pieces.
Et tu compiles depuis le répertoire au-dessus de Prog. Si tu compiles depuis Pieces alors que tu as mis '.' dans le classpath, ça risque de coincer
0
mickeynad Messages postés 18 Date d'inscription dimanche 6 décembre 2009 Statut Membre Dernière intervention 15 juillet 2010
7 déc. 2009 à 17:16
Je suis perdue, car que je compile au dessus de Prog ou depuis Pieces, j'ai la même erreur qui s'affiche (cannot find symbol; symbol class Piece), le compilateur n'arrive pas à retrouver la super classe Piece alors que, d'après ce que tu dis, le classpath semble juste.

Mes fichiers .java sont dans le dossier Prog/Pieces donc c'est le package Prog.Pieces si je ne m'abuse, que je reécris au début de chacun de mes fichiers .java correspondants.
Mes fichiers .java portent le même nom que leur classe correspondante.
La super classe Piece est publique.
Toutes mes classes, super classe et sous classes, sont dans le même package.

Je comprends vraiment pas cette erreur.

En tout cas, merci pour ton aide, je pense que je vais juste enlever le nom du package dans mes sous classes et le garder que dans la classe mère, même si ce n'est pas très correct, c'est la seule alternative que j'ai.
0
Rejoignez-nous