Bonjour à tous,
Je suis débutant en Java. Mon problème est le suivant je souhaiterai compiler deux classes Vector et Matrice qui sont dans le package myPackage, dans des fichiers différents.
Je me positionne dans le package myPackage, je compile la classe Vector, c'est bon,
Par contre quand je veux compiler la classe Matrice, ça ne fonctionne pas, la classe Matrice a besoin de la classe Vector dans sa classe.
Exemple du code :
package myPackage; public class Matrice { protected Vector vX,vY,vZ; // l'erreur ce produit là // Constructeur d'une matrice par 3 vecteurs public Matrice(Vector vX, Vector vY, Vector vZ) { this.vX = vX; this.vY = vY; this.vZ = vZ; }
Voici l'erreur :
C:\>cd j2sdk1.4.2_15 C:\j2sdk1.4.2_15>cd javaexo C:\j2sdk1.4.2_15\javaexo>cd myPackage C:\j2sdk1.4.2_15\javaexo\myPackage>javac Matrice.java Matrice.java:7: cannot resolve symbol symbol : class Vector location: class myPackage.Matrice protected Vector vX,vY,vZ; ........................................................ The system is out of resources. Consult the following stack trace for details. java.lang.OutOfMemoryError
En faite il ne reconnait pas la classe Vector, alors qu'elle est dans le même répertoire, "myPackage", et normallement on utilise pas de import lorsque que les classes sont dans le même package
J'ai essayé aussi avec classpath dans l'option du javac, mais c'est le même problème il ne reconnait pas Vector
Comme ce ci :
C:\j2sdk1.4.2_15\javaexo\myPackage>javac -classpath C:\J2sdk1.4.2_15\bin Matrice .java Matrice.java:7: cannot resolve symbol symbol : class Vector location: class myPackage.Matrice protected Vector vX,vY,vZ; ^
Si quelqu'un à une solution ça serait cool, merci d'avance
dav79
Déjà, et si tu me le permets, le nom de vector est un choix malheureux car il existe déjà un "vector officiel", dans java.util.
Sans compter les problèmes de colision de nom, tu obfusques ton code pour tout le monde (et peut être pour toit aussi). Car quand un programmeur lambda lit "vector", il comprend systématiquement java.util.Vector.
Il y a erreur de fond là, même si ça n'est pas le problème en cet instant. Répertoire n'est pas égal à package.
En effet
C'est pourtant bien là qu'est ton problème. A coup sûr tu t'es trompé dans le classpath.
En revanche, ce message d'erreur
Me laisse songeur je dois dire....
Merci, à toi fredericmazue, pour ta réponse,
Je suis d'accord avec toi, que les noms de mes classes ne sont pas approprié, mais ce sont justes des tests.
Si non, tu as aussi raison pour dire qu'un package n'est pas un répertoire, je me suis mal exprimé.
Maintenant tu me dit que la solution c'est d'utiliser javac -classpath, est ce que ma syntaxe est correcte d'après mon exemple, il n'ya pas d'erreur je positionne la passe sur le path c'est à dire l'adresse du répertoire bin, et normallement ça devrait fonctionner.
Donc ou est le problème.
Est apparamant la dernier message que j'ai n'est pas bon, c'est peut être la que vient le problème, apparamant ça semble un problème de mémoire, en gros
Peut être plus précis dans ta réponse, en me donnant une réponse concrête, je te remercie pour ton aide,
dav79
Donc une fois les tests terminés tu ré-écris tout :?: ;)
Ah ? Ce n'est pas une erreur ça ?
Quant au java.lang.OutOfMemoryError, pour bizarre qu'il soit ce n'est pas le problème. Peut être que que compiles un très gros programme sur une toute petite machine (avec peu de mémoire). Mais même dans ce cas s'il ne trouve pas Vector la raison n'est pas là. (normalement...)
Pour toi le problème est que ta classe Vector n'est pas vue, et si elle n'est pas vue c'est qu'elle n'est pas pointée par le classpath qui soit dit en passant n'ai rien en commun ni avec le path ni avec le répertoire bin.
Donc pour t'aider concrètement je ne peux te dire qu'une chose: donne un classpath correct.
Ok fredericmazue, je viens d'avoir la solution,
On fait c'était tout bête, je n'est même pas besoin d'utiliser un classpath car les classes se trouvent dans le même package, est par défaut le classpath est positionné sur le répertoire courant, le comilateur recherche donc dans ce répertoire. Le problème ne venait pas de là.
Mais simplement au niveau de la syntaxe, voici la bonne instruction:
Donc c'était là problème, il faut pas se positonner dans le package. mais seulement dans le répertoire racine, "javaexo" puise ensuite quand utilise l'instruction javac pour compiler les classes il faut donner le chemin relatif de la classe du package "myPackage"
Et ça marche.
En tout cas merci pour ton aide,
dav79
Ben non...
Ca dépend des JVM et de la plate-forme.
En général (je dis bien en général) le répertoire courant est intégré dans le classpath sous Windows, mais pas sous Linux.
Ce qui revient à un problème de classpath, ni plus ni moins.
C'est vrai que j'aurais pu voir que tu n'étais pas positioné à la racine. Mais ton "répertoire bin" m'a hypnotisé. :lol:
Mais si tu me le permets, je pense que tu n'as pas parfaitement saisi la chose dans toute sa finesse.
Fondamentalement le problème n'est pas le répertoire où tu te situes avant de lancer javac. Le problème est que Vector doit être compilée avant la classe qui l'utilise (ce que tu fais bien) **puis doit être placée** dans le sous répertoire myPackage d'un endroit quelconque faisant partie du classpath.
Dans ton cas, tu t'en sors parce que tu compiles tout au même endroit et que tu déposes les .java et les .class dans le même répertoire.
Mais dès que tu vas travailler avec un projet plus complexe, avec de nombreux packages et répertoires, tu verras que tu vas retomber sur le problème.
Donc je me permets d'insister. Tu dois:
- positionner un classpath correct, qui est pour, reprendre tes termes, une collection (et non un seul) de répertoires racines.
- faire en sorte que les classes compilées, c'est à dire les fichiers .class, soient positionnées sous une quelconque de ces racines, *et* dans un sous -répertoire de même nom que le package.
D'ailleurs si ça t'amuse de regarder, tous les environnements de programmation Java tels Eclipse, Netbeans ou autre séparent (ou permettent de séparer) .java et .class et fonctionnent comme je te l'ai dit.
En espérant avoir été bien clair... :)