à quoi ça sert que je me casse le cul à écrire des méthodes... [JAVA] - Programmation
Marsh Posté le 28-05-2001 à 13:32:40
Si tu pouvais mettre le code de la classe SchemaReaderMain ou la partie de code (lignes 33x) qui plante.
Marsh Posté le 28-05-2001 à 13:35:21
A mon humble avis tu as oublier de mentionner la classe a laquelle tu aplliques ces methodes...
Marsh Posté le 28-05-2001 à 13:38:52
BENB> C'est ce que j'ai pensé au premier abord, mais j'attend de voir son code.
Marsh Posté le 28-05-2001 à 13:49:47
moi je pense plutot ke tes methodes (ki doivent etre statiques) font appelle a des truc non statiques
Bref, en clair, tu fais appelle a des trucs pas statiques et ki devraient l'etre...
Marsh Posté le 28-05-2001 à 15:09:28
chui d'accord avec wouatouwouatou (voila une reponse qu'elle etait utile)
a tout hasard, t'as pas mis ta
Marsh Posté le 28-05-2001 à 15:10:12
chui d'accord avec wouatouwouatou (voila une reponse qu'elle etait utile)
a tout hasard, t'as pas mis ta méthode countPrim en static dans ta classe? moi ca m'etonnerais po...
si c le cas, met int nb= NomClasse.countPrim(in)
Marsh Posté le 28-05-2001 à 16:53:56
Dans ton cas, countPrim() n'est pas accessible depuis ta classe où tu l'utilise; si par exemple c'est une méthode de la classe UnTruc essaie :
int leNb = UnTruc.countPrim(in);
Si par contre countPrim est un objet et que tu fais appel à son contructeur (pour instancier un nouvel objet) il faut faire :
int leNb= new ( countPrim());
essaie la doc Sun, y a toutes les méthodes de décrites pour toutes les classes de chaque package. (la classe SchemaReaderMain est de ta conception ?)
Marsh Posté le 29-05-2001 à 10:32:37
Voilà le code source incriminé :
import java.io.*;
public class SchemaReaderMain {
public File inputFile;
public SchemaReaderMain(File inputFile) {
this.inputFile = inputFile;
}
public int countPrim(File inputFile) {
int nbPrim = 0;
try {
BufferedReader input = new BufferedReader(new FileReader(inputFile));
String s = new String();
while ((s = input.readLine()) != null) {
if(s.startsWith("<primitive>" ))
nbPrim++;
}
input.close();
}
catch (java.io.IOException e) {
System.err.println("Caught IOException: " + e.getMessage());
}
return nbPrim;
}
private int countList(File inputFile) {
int maxList = 0;
try {
int nbPrim = countPrim(inputFile);
int[] nbList = new int[nbPrim];
for(int i = 0; i < nbPrim; i++)
nbList[i] = 0;
int i = 0;
BufferedReader input = new BufferedReader(new FileReader(inputFile));
String s = new String();
while ((s = input.readLine()) != null) {
if(s.startsWith("<list>" ))
nbList[i]++;
if(s.startsWith("</primitive>" ))
i++;
}
input.close();
for(i = 0; i < nbPrim; i++)
if(nbList[i] > maxList)
maxList = nbList[i];
}
catch (java.io.IOException e) {
System.err.println("Caught IOException: " + e.getMessage());
}
return maxList;
}
public PrimitiveObj[] readPrimitive(File inputFile) {
int nbPrim = countPrim(inputFile);
PrimitiveObj[] primitiveObj = new PrimitiveObj[nbPrim];
String primName = new String();
int nbList = countList(inputFile);
String[] primList = new String[nbList];
try {
int i = 0;
int j = 0;
BufferedReader input = new BufferedReader(new FileReader(inputFile));
String s;
while ((s = input.readLine()) != null) {
if(s.startsWith("<p_name>" ))
primName = s.substring(8, s.length()-9);
if(s.startsWith("<p_list>" )) {
primList[i] = s.substring(8, s.length()-9);
i++;
}
if(s.startsWith("</primitive>" )) {
i = 0;
primitiveObj[j] = new PrimitiveObj(primName, primList);
j++;
}
}
}
catch (java.io.IOException e) {
System.err.println("Caught IOException: " + e.getMessage());
}
return primitiveObj;
}
public static void main(String[] args) {
File in = new File("testread.xml" );
int nb = countPrim(in);
int nl = countList(in);
PrimitiveObj[] primitiveObj = new PrimitiveObj[nb];
primitiveObj = readPrimitive(in);
for(int i = 0; i < nb; i++) {
System.out.println(primitiveObj[i].primName);
for(int j = 0; j < nl; j++) {
System.out.println(primitiveObj[i].primList[j]);
}
}
}
}
Bon, pour préciser un peu les choses, cette classe maison servira si elle marche un jour à lire un fichier xml, d'une forme assez complexe contenant des balises <p_name> et <p_list>.
Le but est de créer des objet PrimitiveObj à la lecture du document. Un objet PrimitiveObj ne contient que des données publiques :
String primName; : correspond à <p_name>
String[] primList; : correspond à <p_list>
Voilà, mon PC déconne un peu, donc je suis un peu long à la détente en ce moment.
Les erreurs de compilations que j'ai eu sont incompréhensible pour moi : je ne les ai jamais eu, et comme je débute, je n'ai pas le recul suffisant.
Marsh Posté le 29-05-2001 à 10:39:33
ben dans ton main il manque la creation d'une classe
toto SchemaReaderMain(in);
et apres
toto.count....
Marsh Posté le 29-05-2001 à 12:57:03
Bon sang, j'ai l'impression d'être encore plus con que d'habitude. Faut pas m'en vouloir, mon truc c'est gcc et le langage C. Alors Java en autoformation c'est un peu galère.
Tu dis qu'il faut que je crée un objet du type SchemaReaderMain et que je lui applique les méthodes que j'ai créée. Tu peux me montrer (me prendre par la main...).
Marsh Posté le 29-05-2001 à 13:02:45
public static void main(String[] args)
{
File in = new File("testread.xml" );
SchemaReaderMain toto(in);
int nb = countPrim(in);
int nl = toto.countList(in);
PrimitiveObj[] primitiveObj = new PrimitiveObj[nb];
primitiveObj = toto.readPrimitive(in);
for(int i = 0; i < nb; i++) {
System.out.println(primitiveObj[i].primName);
for(int j = 0; j < nl; j++) {
System.out.println(primitiveObj[i].primList[j]);
}
}
}
[#0000ff]
voila...
Marsh Posté le 30-05-2001 à 03:47:17
Sinon, autre possibilité (qui se rapproche de C) : tu définis tes méthodes comme statiques. Dans ce cas, tu n'as plus à appliquer ta méthode sur un objet, car il n'y a pas de this quand tu es dans la méthode.
Question bête : dans ta méthode countPrim(), quel est l'intérêt de passer ton objet File en paramètre, puisque tu l'as déjà : ben oui, il est déjà dans this.inputFile. Même question pour les méthodes countList() et readPrimitive().
D'ailleurs, javac devrait te signaler (en tant que warning) que dans ces 3 méthodes, tu définis un paramètre inputStream qui masque l'attribut du même nom.
[edit]--Message édité par BifaceMcLeOD--[/edit]
Marsh Posté le 30-05-2001 à 08:35:28
Merci beaucoup, maintenant ça compile impécable ! C'est un peu poussé je sais, mais je vais quand même abuser de votre générosité : le compilo (par l'entremise de Forte CE) me renvoie Caught IOException: testread.xml (le fichier spécifié est introuvable)
Bon, pour tout dire, j'ai placé ledit fichier dans le même répertoire que les fichiers class. Peut-être que ce n'est pas ça que je dois faire...
Marsh Posté le 30-05-2001 à 16:10:05
ReplyMarsh Posté le 31-05-2001 à 09:44:52
J'ai essayé le debugger de Forte, j'ai posé des breakpoints aux endroits critiques, mais là, vraiment je ne vois pas ce qui dérange. J'ai vraiment besoin d'aide ici.
Le didacticiel de java.sun.com est certes bien fait, mais il ne gère pas des cas aussi dense.
Si qqn sait, enfin bref, vous savez...
Merci
Marsh Posté le 31-05-2001 à 10:03:52
En fait, jsais pas trop ce kes ton fichier ni koment tu y accede... mais bon.. Essaie de mettre ton fichier dans le repertoire ou se trouve l'exe de ton compilo...
Marsh Posté le 31-05-2001 à 10:37:03
Pas con ça, j'avais pas pensé. Pour l'instant j'ai testé dans le répertoire de l'appli et C:\
En faisant ça et avec le code minimal suivant (j'ai renommé la classe pour les besoins du compilateur), ça ne marche pas je me prends toujours une Caught IOException: testread.xml (le fichier spécifié est introuvable) dans la face.
Voilà le code minimal que je cherche à faire marcher :
import java.io.*;
public class SchemaReaderTest {
public File inputFile;
public SchemaReaderTest(File inputFile) {
this.inputFile = inputFile;
}
public int countPrim(File inputFile) {
int nbPrim = 0;
try {
BufferedReader input = new BufferedReader(new FileReader(inputFile));
String s = new String();
while ((s = input.readLine()) != null) {
if(s.startsWith("<primitive>" ))
nbPrim++;
}
input.close();
}
catch (java.io.IOException e) {
System.err.println("Caught IOException: " + e.getMessage());
}
return nbPrim;
}
public static void main(String[] args) {
File in = new File("exempleaude.xml" );
SchemaReaderTest schemaReader = new SchemaReaderTest(in);
int nb = schemaReader.countPrim(in);
System.out.println("nb = " + nb);
}
}
Merci beaucoup
Marsh Posté le 31-05-2001 à 12:13:43
[JAVA] à quoi ça sert que je me casse le cul à écrire des méthodes...
ben à passer le temps...
Marsh Posté le 31-05-2001 à 13:19:44
t'appelles ca un code minimal ??!!
Marsh Posté le 31-05-2001 à 13:39:16
au fait, ta pa du lire le post de mcleod... tes methodes, elles ont pas besoin du parametre...
Code :
|
Essaie ca... j'ai modifié ton code ( minimal )...pi dis moi si ca marche
[edit]--Message édité par wouatouwouatou--[/edit]
Marsh Posté le 31-05-2001 à 14:22:19
Merci beaucoup, je n'ai pas encore testé ton source mais déjà il me montre que je ne suis pas encore un bon programmeur. Je teste ça et je te dis...
Marsh Posté le 31-05-2001 à 16:06:34
Heu, y'a un truc que le compilo n'aime pas dans ton source :
SchemaReader.java [30:1] Exception java.io.IOException thrown from close must be caught, or it must be declared in the throws clause of this method
input.close();
^
La ligne indiquée ne veut rien dire, car j'ai modifié le fichier en profondeur. Cela dit il y a un truc que je n'arrive pas à faire parce que le compilo me dit qu'il se peut que mon objet ne soit pas initialisé :
SchemaReader.java [79:1] Variable primitiveList may not have been initialized.
primitiveList[i][j] = s.substring(8, s.length()-9);
^
Le truc c'est que je mesure exactement avec mes fameuses méthodes la taille exacte des mes listes et ensuite je me sers de ces valeurs en initialisation. Une idée ?
Marsh Posté le 31-05-2001 à 16:15:38
jai pas de koi tester ca...
mais pour le close... rajoute un try catch dans le if...
quant a ton primitive ...truc... je le voit pas... dsl
Mais l'erreur signifie ke tu dois l'initialiser avant de lutiliser...
Marsh Posté le 31-05-2001 à 16:23:19
OK pour le close, j'en suis capable.
Je cherche sur le coup de l'init, mais y'a pas un moyen de dire au compilo : "t'occupes, j'ai pensé à ta place."
Marsh Posté le 31-05-2001 à 16:47:36
Si ta ce message.. c ke tu risque de lutiliser avant de l'initialiser.. donc, ta interet a linitialiser avant !!!!
Mais si ta absolument besoin... lors de ta declaration, tu le met egal a null...
Code :
|
ou encore :
Code :
|
mais bon.. jsuis pas sur de la syntaxe...
Marsh Posté le 31-05-2001 à 18:51:38
Effectivement, le diagnostic de wouatouwouatou est correct, il faut que tu initialises ta variable quand tu la déclares :
Code :
|
Marsh Posté le 28-05-2001 à 12:31:15
Bon, voilà j'ai fait un beau fichier avec plein de méthodes public parce que je débutte et j'ai un gros pépin.
Quand je compile il me dit ça :
SchemaReaderMain.java [330:1] Can't make static reference to method public int countPrim(File) in class SchemaReaderMain.
int nb = countPrim(in);
^
SchemaReaderMain.java [330:1] Cannot parse initializer
int nb = countPrim(in);
^
SchemaReaderMain.java [331:1] Can't make static reference to method private int countList(File) in class SchemaReaderMain.
int nl = countList(in);
^
SchemaReaderMain.java [331:1] Cannot parse initializer
int nl = countList(in);
^
SchemaReaderMain.java [333:1] Can't make static reference to method public PrimitiveObj[] readPrimitive(File) in class SchemaReaderMain.
primitiveObj = readPrimitive(in);
^
5 errors
Alors quoi que je fais moi !