IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

Format d'�change (XML, JSON...) Java Discussion :

[D�butante] API DOM : Une erreur de d�claration "parser.parse()" qui ne compile pas


Sujet :

Format d'�change (XML, JSON...) Java

  1. #1
    Membre actif
    Femme Profil pro
    �tudiant
    Inscrit en
    Avril 2014
    Messages
    62
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 62
    Par d�faut [D�butante] API DOM : Une erreur de d�claration "parser.parse()" qui ne compile pas
    Bonjour a vous tous
    j'ai besoin de votre aide pour un erreur de declaration API DOM
    pourriez vous verifier ma d�claration en rouge car je ne sais pas
    ou est l'erreur
    merci de votre temps

    Voci mon code
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    public class calculatrice2 {
    
    public static void main(String[] args) {
        int num1 = Integer.parseInt(args[0]);
    	String num2 = (args[1]);
        int num3 = Integer.parseInt(args[2]);
        int numsum = (num1+num3);
        int numsub = (num1-num3);
    
    
           DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
           DocumentBuilder parser = factory.newDocumentBuilder();
           Document doc = parser.parse();
    		Element math = doc.createElement("math");
    		math.setAttribute("xmlns","http://www.w3.org/1998/Math/MathML");
           		doc.appendChild(math);       		Element mrow = doc.createElement("mrow");
           		Element mn1 = doc.createElement("mn");
         		mn1.appendChild(doc.createTextNode(args[0]));
    		Element mo1 = doc.createElement("mo");
         		mo1.appendChild(doc.createTextNode(args[1]));
           		Element mn2 = doc.createElement("mn");
           		mn2.appendChild(doc.createTextNode(args[2]));
           		Element mo2 = doc.createElement("mo");
           		mo2.appendChild(doc.createTextNode("="));
           		Element mn3 = doc.createElement("mn");
           		mn2.appendChild(doc.createTextNode("results"));
    		Element mrow1 = doc.createElement("mrow");
           		Element mtext = doc.createElement("mtext");
    		mtext.appendChild(doc.createTextNode("vrai"));
    			mrow.appendChild(mn1);
    			mrow.appendChild(mo1);
    			mrow.appendChild(mn2);
    			mrow.appendChild(mo2);
    			mrow.appendChild(mn3);
    			mrow.appendChild(mrow1);
    			mrow1.appendChild(mtext);
    			math.appendChild(mrow);
    switch (args[2])
    {
    //Addition
    case "+":
    Element mn6 = doc.createElement (  "mn");
    mn6.appendChild(doc.createTextNode(Integer.toString(numsum)));
    //Soustraction
    case "-":
    Element mn7 = doc.createElement (  "mn");
    mn7.appendChild(doc.createTextNode(Integer.toString(numsub)));
    
    //Comparaisons
    case "&lt":
    	if(Integer.parseInt(args[1])<Integer.parseInt(args[3]))
    		//Result=="vrai";
    		{Element mtext1 = doc.createElement ("mtext");
    		mtext.appendChild(doc.createTextNode("vrai"));}
    	else //Result=="faux";
    		{Element mtext2 = doc.createElement ("mtext");
    		mtext.appendChild(doc.createTextNode("faux"));}
    case "&gt":
    	if(Integer.parseInt(args[1])>Integer.parseInt(args[3]))
    		//Result=="vrai";
    		{Element mtext3 = doc.createElement ("mtext");
    		mtext.appendChild(doc.createTextNode("vrai"));}
    	else //Result=="faux";
    		{Element mtext4 = doc.createElement ("mtext");
    		mtext.appendChild(doc.createTextNode("faux"));}
    }
    
       TransformerFactory tfact = TransformerFactory.newInstance();
           Transformer transformer =  tfact.newTransformer();
              transformer.setOutputProperty("encoding", "ISO-8859-1");
       DOMSource source = new DOMSource(doc);
       FileWriter fw = new FileWriter(args[0]);
    
    StreamResult result = new StreamResult(System.out);
    transformer.transform(source, result);}
    }
    voici input attendu lorsque je tape la ligne de commande suivante
    java calculatrice2 2-1

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
     <math xmlns="http://www.w3.org/1998/Math/MathML">
       <mrow>
         <mn>2</mn>
         <mo>-</mo>
         <mn>1</mn>
         <mo>=</mo>
         <mn>1.0</mn>
       </mrow>
     </math>
    et voici le resultat attendu lorsque je tape la ligne de commande
    java calculatrice2 1.5 "<" 2
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
     <math xmlns="http://www.w3.org/1998/Math/MathML">
       <mrow>
         <mn>1.5</mn>
         <mo>&lt;</mo>
         <mn>2</mn>
         <mo>=</mo>
         <mrow><mtext>vrai</mtext></mrow>
      </mrow>
      </math>
    je pense que je suis encore loin de la solution!

  2. #2
    Mod�rateur
    Avatar de joel.drigo
    Homme Profil pro
    Ing�nieur R&D - D�veloppeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 55
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur R&D - D�veloppeur Java
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par d�faut
    Salut,

    1. DocumentBuilder.parse() est fait pour "lire" une source (un fichier par exemple).
      Pour cr�er un Document, il faut faire :
      Code : S�lectionner tout - Visualiser dans une fen�tre � part
      1
      2
      DocumentBuilder documentBuilder = factory.newDocumentBuilder();
      Document doc = documentBuilder.newDocument();
    2. Ensuite, il y a plusieurs m�thodes que tu appelles qui soul�vent des exceptions, qu'il te faudra attraper (try/catch ou throws).
    3. Il y a par ailleurs un probl�me dans le r�sultat, mais je te laisse regarder �a toi-m�me pour l'instant (indice : il faut tester l'op�rateur)
    L'expression "�a marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le probl�me.
    La plupart des r�ponses � vos questions sont d�j� dans les FAQs ou les Tutoriels, ou peut-�tre dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement pos�e et r�dig�e et vous aurez plus de chances de r�ponses adapt�es et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'�diteur de messages).
    Nouveau sur le forum ? Consultez Les R�gles du Club.

  3. #3
    Membre actif
    Femme Profil pro
    �tudiant
    Inscrit en
    Avril 2014
    Messages
    62
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 62
    Par d�faut TRY et catch comment ca marche vous avez raison pour l'exception
    Citation Envoy� par joel.drigo Voir le message
    Salut,

    1. DocumentBuilder.parse() est fait pour "lire" une source (un fichier par exemple).
      Pour cr�er un Document, il faut faire :
      Code : S�lectionner tout - Visualiser dans une fen�tre � part
      1
      2
      DocumentBuilder documentBuilder = factory.newDocumentBuilder();
      Document doc = documentBuilder.newDocument();
    2. Ensuite, il y a plusieurs m�thodes que tu appelles qui soul�vent des exceptions, qu'il te faudra attraper (try/catch ou throws).
    3. Il y a par ailleurs un probl�me dans le r�sultat, mais je te laisse regarder �a toi-m�me pour l'instant (indice : il faut tester l'op�rateur)
    Un gros merci pour l'aide!

    mon code fonctionne lorsque je tape la ligne de commande
    java calculatrice 2 - 1
    mais lorsque j'utilise
    java calculatrice 1.5 "<" 2
    la rien ne va plus
    et je ne sait pas comment utilise try et catch dans les param�tr�s entre
    pourriez vous m'aide S.V.P

    voici mon nouveau code
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
    public class calculatrice2 {
     
    public static void main(String[] args) throws Exception {
        double num1 = Integer.parseInt(args[0]);
    	String num2 = (args[1]);
        double num3 = Integer.parseInt(args[2]);
        double numsum = (num1+num3);
        double numsub = (num1-num3);
     
     
           DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
           DocumentBuilder documentBuilder = factory.newDocumentBuilder();
           Document doc = documentBuilder.newDocument();
    		Element mrow = doc.createElement("math");
    		mrow.setAttribute("xmlns","http://www.w3.org/1998/Math/MathML");
           		doc.appendChild(mrow);
     
                Element mrow0 = doc.createElement("mrow");
    			mrow.appendChild(mrow0);
           		Element mn1 = doc.createElement("mn");
    			mrow.appendChild(mn1);
     
         		mn1.appendChild(doc.createTextNode(args[0]));
    		    Element mo1 = doc.createElement("mo");
    			mrow.appendChild(mo1);
     
         		mo1.appendChild(doc.createTextNode(args[1]));
           		Element mn2 = doc.createElement("mn");
    			mrow.appendChild(mn2);
     
           		mn2.appendChild(doc.createTextNode(args[2]));
           		Element mo2 = doc.createElement("mo");
    			mrow.appendChild(mo2);
     
           		mo2.appendChild(doc.createTextNode("="));
    			mrow.appendChild(mo2);
     
    switch (num2)
    {
    case "+":
         Element mn3 = doc.createElement("mn");
                  String numsum1 = Double.toString(numsum);
         mn3.appendChild(doc.createTextNode(numsum1));
    	 mrow.appendChild(mn3);
     
    	 Element mrow2 = doc.createElement("mrow");
         mrow.appendChild(mrow2);
     
     break;
    case "-":
    	Element mn7 = doc.createElement (  "mn");
         Element mn4 = doc.createElement("mn");
             String numsub1 = Double.toString(numsub);
         mn4.appendChild(doc.createTextNode(numsub1));
    	 mrow.appendChild(mn4);
     
    	 Element mrow3 = doc.createElement("mrow");
    	 mrow.appendChild(mrow3);
     break;
    case "&lt":
    if(Integer.parseInt(args[1])<Integer.parseInt(args[3]))
    		{	Element mtext = doc.createElement("mtext");
    		    mtext.appendChild(doc.createTextNode("vrai"));
    			mrow.appendChild(mtext);
    			mrow.appendChild(mrow);
    	    }
    case "&gt":
    if(Integer.parseInt(args[1])>Integer.parseInt(args[3]))
    		{	Element mtext = doc.createElement("mtext");
    		    mtext.appendChild(doc.createTextNode("vrai"));
    			mrow.appendChild(mtext);
    			mrow.appendChild(mrow);
    		}
     break;
    }
    // Affichage du document en ligne de commande
       TransformerFactory tfact = TransformerFactory.newInstance();
       Transformer transformer =  tfact.newTransformer();
       transformer.setOutputProperty("encoding", "ISO-8859-1");
       DOMSource source = new DOMSource(doc);
       FileWriter fw = new FileWriter(args[0]);
       StreamResult result = new StreamResult(System.out);
       transformer.transform(source, result);
     
    }}

  4. #4
    Mod�rateur
    Avatar de joel.drigo
    Homme Profil pro
    Ing�nieur R&D - D�veloppeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 55
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur R&D - D�veloppeur Java
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par d�faut
    Citation Envoy� par emykev22 Voir le message
    ...
    mais lorsque j'utilise
    java calculatrice 1.5 "<" 2
    la rien ne va plus
    C'est normal :

    On est pas en html/xml. Pas besoin d'�chapper le < dans une String Java. Fais directement [c]case "<":[/code].


    Citation Envoy� par emykev22 Voir le message
    ...

    et je ne sait pas comment utilise try et catch dans les param�tr�s entre

    Mais dans le cas g�n�ral, si tu as un statement qui soul�ve une exception (autre qu'une RuntimeException), il faut la traiter explicitement.

    Par exemple, dans ton code, factory.newDocumentBuilder(); produit une exception ParserConfigurationException. On peut la traiter de diff�rentes mani�res. Laquelle est l� mieux ? �a d�pend, de ce que tu veux faire, et de ce que l'application doit faire, et du service que tu vas donner � l'utilisateur (message d'information, log pour le d�veloppeur, autocorrection, etc..., faire que �a plante pas lamentablement...) : et pour �a on a 2 outils.

    Le catch, permet d'attraper l'erreur est de faire le traitement � cet endroit.

    Par exemple, lorsqu'on appelle parseInt() sur une chaine qui ne peut pas �tre transform�e en int, on obtient une NumberFormatException.

    On peut donc �crire quelque chose comme �a :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    public static void main(String[] args) throws Exception {
    	String operateur = (args[1]);
    	try {
    	    double num1 = Integer.parseInt(args[0]);
    		try {
    			double num3 = Integer.parseInt(args[2]);
    			run(num1, operateur, num3);
    		}
    		catch( NumberFormatException e) {
    			System.err.println("Erreur: le second opérande doit être un nombre !");
    		}
    	}
    	catch( NumberFormatException e) {
    		System.err.println("Erreur: le premier opérande doit être un nombre !");
    	}
    }
     
    private static void run(double num1, String num2, double num3)  throws Exception {
     
        double numsum = (num1+num3);
        double numsub = (num1-num3);
     
    /*...*/
    L'autre moyen est le throws : on l'utilise quand on ne sait pas quoi faire de l'exception, ou que ce n'est pas logique qu'on s'en occupe � notre niveau de code. C'est pour �a d'ailleurs que parseInt() retourne une NumberFormatException au lieu d'affiche un message : ce n'est pas � cette m�thode de d�cider d'afficher quelque chose. Chaque programme, voire chaque m�thode pourra r�agir de fa�on diff�rente et non pr�visible � cette erreur.

    Bien s�r, il y a des erreurs techniques qu'on ne peut pas vraiment r�soudre et autant faire un throws : par exemple, en cas IOException une lecture de fichier en plein milieur, plut�t que de mettre un laconique ("impossible de lire la fin de "truc.machin" : votre fichier est peut-�tre corrompu, ou votre disque a peut-�tre des secteurs d�fectu�s, ou je ne sais quoi...", autant laisser la stack trace de base s'afficher.

    Maintenant, il vaut mieux �viter de faire un throws Exception. Il vaut mieux faire des throws de chaque exceptions qui sont remont�es. Ceci essentiellement afin de traiter vraiment les exceptions qui sont cens� �tre trait�es dans le code qui appelle la m�thode (avec throws Exception, l'appelant sera obliger de faire catch Exception, ce qui ne l'aidera pas s'il veut faire un traitement diff�renci� des diff�rentes exceptions). Pour la m�thode main() c'est diff�rent, c'est rare qu'on l'appelle, mais ce n'est pas impossible : autant ne remonter que les exceptions qui sont vraiment soulevables dans le code. Il y a aussi une histoire de performance, mais l� aussi, dans le cas de ton programme, c'est n�gligeable.

    Ensuite, il y a des cas o� on peut s'arranger pour que l'exception ne se produise pas. Par exemple, on sait que l'utilsateur peut oublier des param�tres, ou peut taper un op�rateur qu'on ne traite pas(la multiplication par exemple, ou m�me un caract�re qui n'a pas de sens en tant qu'op�rateur). Plut�t que d'esp�rer que �a plantera � cause d'une exception, ou, pire, que �a donne un r�sultat incompr�hensible, autant tester ces cas, lorsqu'on le peut.

    Par exemple, d�s le d�but :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    if ( args.length()< .. ) {
     
    System.err.println("Il manque des paramètres"); // par exemple
     
    }
    else {
    /*...*/

    Par ailleurs, je n'ai pas lu tout ton code, mais j'ai vu 2 ou 3 choses qui ne vont pas :

    1. double num1 = Integer.parseInt(args[0]);Ce n'est pas tr�s logique : si on parse une String de cette mani�tre, on obtient un entier (un int). Pourquoi le mettre dans un double ? N'est-ce pas plut�t un double que tu veux parser ?
      [c]double num1 = Double.parseDouble(args[0]);
    2. Ensuite �vite de faire plusieurs fois la m�me chose (des Integer.parseInt(args[3)); par exemple). D'ailleurs d�barrasse toi au plus t�t des param�tres de type tableau. Ceci te permet d'avoir des param�tres bien identifi�s aux types identifi�s (on a un op�rande de type double, un op�rateur de type String, un autre op�rante de type double et un nom de fichier). Plut�t qu'un tableau de String[] que tu parses sans arr�t. Au moins, �a t'�vitera les erreurs comme celle de faire :

      Code : S�lectionner tout - Visualiser dans une fen�tre � part
      FileWriter fw = new FileWriter(args[0]);
      � la fin de ton code,

      Alors qu'au d�but :
      Code : S�lectionner tout - Visualiser dans une fen�tre � part
       double num1 = Integer.parseInt(args[0]);
      Il y a quelque chose de pas logique. Remarque ce n'est pas impossible que le fichier ait pour nom la valeur de l'op�rande, mais � mon avis, ce n'est pas ce que tu voulais/devais faire.

      D'autre part, �a t'�vitera en cas de modification du code, de devoir faire la modification � plusieurs endroits, et donc d'en favoriser l'oubli.

    3. Une autre chose : des noms adapt�s et significatifs sont pr�f�rables, pour ne pas se tromper, ou lire plus facilement le code pour le d�boguer :
      Tu as �crit String num2 = args[1]; alors que String operateur = args[1] sera plus clair : on sait que c'est l'operateur en voyant le nom de la variable.
    4. il y en a peut-�tre d'autres, mais je vais arr�ter l� pour le moment.
    L'expression "�a marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le probl�me.
    La plupart des r�ponses � vos questions sont d�j� dans les FAQs ou les Tutoriels, ou peut-�tre dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement pos�e et r�dig�e et vous aurez plus de chances de r�ponses adapt�es et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'�diteur de messages).
    Nouveau sur le forum ? Consultez Les R�gles du Club.

  5. #5
    Membre actif
    Femme Profil pro
    �tudiant
    Inscrit en
    Avril 2014
    Messages
    62
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 62
    Par d�faut J'apprecie ton explication et sa ma �clar� sur try/catch mais je suis imcapable d'entre un double en param�tre
    Encore merci pour toutes les explications donn�es

    J'ai modifi� mom code avec le try sa fonctionne bien lorsque Je tape la ligne de commande !

    java calculatrice 2 - 1
    malgre que le output est en chiffre double plut�t d'avoir 2 a l'�cran j'ai 2.0

    mais lorsque je tape

    java calculatrice 1.5 "<" 2
    je tomber dans l'erreur du cath "le premier operade doit �tre un nombre"
    il ne prend pas le double
    comment faire pour avoir des parametres diff�rents en entr�
    est-ce que je doit formatter mon entre et comment

    Merci encore de tout ton temps je ne sais comment te remercier...

  6. #6
    Mod�rateur
    Avatar de joel.drigo
    Homme Profil pro
    Ing�nieur R&D - D�veloppeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 55
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur R&D - D�veloppeur Java
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par d�faut
    Mais as-tu bien remplac� les Integer.parseInt() par des Double.parseDouble() ?

    Sur le fait que �a affiche 2.0 quand tu saisi 2, c'est parce que justement tu stocke la valeur dans un double. Si tu as besoin d'obtenir une valeur sans le .0 � la fin, il faudra l'enlever par du code.

    On peut faire par exemple :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public static String toString(double valeur) {
     
        String string = String.valueOf( valeur ) ;
     
        if ( string.endsWith(".0") ) {
            return string.substring(0, string.length()-2);
        }
        else {
           return string;
        }
     
    }
    Et utiliser cette m�thode au lieu d'un String.valueOF() pour faire la conversion.

    Si on veut pouvoir sortir une valeur qui correspond aux param�tres en entr�e, c'est-�-dire un entier lorsque les 2 param�tres sont entiers, on peut stocker un bool�en d�s le d�but :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    boolean tousentiers = arg[0].indexOf('.')==-1 && arg[2].indexOf('.')==-1; // adapter les idnex en fonction de la position de tes paramètres
    Et pour la conversion (le param�tre "entier" � passer est la variable tousentiers) :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    public static Strnig toString(double valeur, boolean entier) {
          if( entier ) {
             return String.valueOf((int)valeur);
          }
          else {
             return String.valueOf(valeur);
          }
    }
    L'expression "�a marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le probl�me.
    La plupart des r�ponses � vos questions sont d�j� dans les FAQs ou les Tutoriels, ou peut-�tre dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement pos�e et r�dig�e et vous aurez plus de chances de r�ponses adapt�es et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'�diteur de messages).
    Nouveau sur le forum ? Consultez Les R�gles du Club.

  7. #7
    Membre actif
    Femme Profil pro
    �tudiant
    Inscrit en
    Avril 2014
    Messages
    62
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 62
    Par d�faut Gros merci avant tout, je ne sais pas si j'ai tout compris les explication mais voil�
    Selon ce que j'ai compris comme d�butante
    Voici mon nouveau code
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    public static void main(String[] args) throws Exception {
    
    	boolean operateur = arg[1].indexOf('"')==+1 && arg[3].indexOf('"')==-1;
    	try {
    	    double num1 = Double.parseDouble(args[0]);
    		try {
    			double num3 = Double.parseDouble(args[2]);
    			run(num1, operateur, num3);
    		}
    		catch( NumberFormatException e) {
    			System.err.println("Erreur: le second op�rande doit �tre un nombre !");
    		}
    	}
    	catch( NumberFormatException e) {
    		System.err.println("Erreur: le premier op�rande doit �tre un nombre !");
    	}
    }
    
    
    private static void run(double num1, boolen operateur, double num3)  throws Exception {
    
        double numsum = (num1+num3);
        double numsub = (num1-num3);
    
           DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
           DocumentBuilder documentBuilder = factory.newDocumentBuilder();
           Document doc = documentBuilder.newDocument();
    	   Element mrow = doc.createElement("math");
    	   mrow.setAttribute("xmlns","http://www.w3.org/1998/Math/MathML");
           		doc.appendChild(mrow);
    
                Element mrow0 = doc.createElement("mrow");
    			mrow.appendChild(mrow0);
           		Element mn1 = doc.createElement("mn");
    			mrow.appendChild(mn1);
    
    
                String num1s = String.valueOf(num1) ;
                if ( num1s.endsWith(".0") ) {
                   num1s = num1s.substring(0, num1s.length()-2);
    
                }
         		mn1.appendChild(doc.createTextNode(num1s));
        	    mrow.appendChild(mn1);
    
    		    Element mo1 = doc.createElement("mo");
    			mrow.appendChild(mo1);
    
    
         		mo1.appendChild(doc.createTextNode(operateur));
           		Element mn2 = doc.createElement("mn");
    			mrow.appendChild(mn2);
    
                String num3s = String.valueOf(num3) ;
                if ( num3s.endsWith(".0") ) {
                   num3s = num3s.substring(0, num3s.length()-2);
    
                }
           		mn2.appendChild(doc.createTextNode(num3s));
    			mrow.appendChild(mn2);
    
           		Element mo2 = doc.createElement("mo");
    			mrow.appendChild(mo2);
    
           		mo2.appendChild(doc.createTextNode("="));
    			mrow.appendChild(mo2);
    
    switch (operateur)
    {
    case "+":
           String numsum1 = Double.toString(numsum);
           Element mn3 = doc.createElement("mn");
           mn3.appendChild(doc.createTextNode(numsum1));
    	   mrow.appendChild(mn3);
           break;
    case "-":
           String numsub1 = Double.toString(numsub);
           Element mn4 = doc.createElement("mn");
           mn4.appendChild(doc.createTextNode(numsub1));
    	   mrow.appendChild(mn4);
             break;
    case "<":
    
    	   Element mrow3 = doc.createElement("mrow");
           mrow.appendChild(mrow3);
    
           Element mtext = doc.createElement("mtext");
    	   mtext.appendChild(doc.createTextNode("vrai"));
    	   mrow.appendChild(mtext);
    
    	   Element mrow4 = doc.createElement("mrow");
    	   mrow.appendChild(mrow4);
           break;
    
    case">":
    	   Element mrow5 = doc.createElement("mrow");
    	   mrow.appendChild(mrow5);
    
           Element mtext1 = doc.createElement("mtext");
    	   mtext1.appendChild(doc.createTextNode("Faux"));
    	   mrow.appendChild(mtext1);
    	   Element mrow6 = doc.createElement("mrow");
    	   mrow.appendChild(mrow6);
           break;
    }
       Element mrow2 = doc.createElement("mrow");
       mrow.appendChild(mrow2);
    Maintenant lorsque je tape la ligne de commande
    java calculatrice 2 - 1
    Le r�sultat est bon et les chiffre sont des entiers selon vos conseils

    Lorsque je tape la ligne de commande
    java calculatrice 1.5 "<" 2

    Le r�sultat est bon a l�exception des lignes que j'ai mis rouge qui ne s'affiche pas � l��cran
    Pourriez vous v�rifiez S.V.P.
    P.S. je sais que le code pourrait �tre am�lior�...

  8. #8
    Mod�rateur
    Avatar de joel.drigo
    Homme Profil pro
    Ing�nieur R&D - D�veloppeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 55
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur R&D - D�veloppeur Java
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par d�faut
    Pour la premi�re ligne "rouge" :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    	boolean operateur = arg[1].indexOf('"')==+1 && arg[3].indexOf('"')==-1;
    J'avais �crit : boolean tousentiers = arg[0].indexOf('.')==-1 && arg[2].indexOf('.')==-1;. Donc rien � voir avec ce que tu as �crit.

    Le but de cette ligne est juste de d�terminer si tous les op�randes (les valeurs qui sont utilsis�es dans les calculs) si sont tous entier, parce que le r�sultat est entier que si tous les op�randes sont entiers (1 + 1 = 0, mais 1.5 + 1 = 1.5). Parce que tu voulais un r�sultat dans ton xml du type "1" comme on rentre des entiers, et pas "1.0".

    Pour tester si un nombre est un entier ou un double, on teste s'il y a un . (un point) dedans. Dans ton code tu cherches si le nombre contient une double-quote... Ensuite, indexOf() d�termine la position du caract�re pass� en param�tre : si cette position est �gale � -1, le caract�re ne se trouve pas dans la cha�ne. -1, pas +1.

    Ensuite, ce bool�en n'a rien � voir avec l'op�rateur : l'op�rateur c'est un caract�re pas un bool�en d�j�. Et l'op�rateur c'est, comme tu l'avais fait d�s le d�but le param�tre entre les 2 op�randes. Simplement dans ton code, � la fin tu utilises le param�tre arg[0] comme nom de fichier, alors qu'au d�but du programme tu l'utilise comme op�rande num�ro 1 : �a ne peut pas �tre les 2 � la fois (enfin si �a pourrait, mais je suppose que ce n'est pas ce que tu veux faire, sinon, si tu fais le calcul 1 + 1, ton fichier va s'appeler 1. Donc d�j� il faut que tu d�cides d'o� vient le nom du fichier.


    Mais si on part sur la base que les param�tres sont op�rande 1, op�rateur, op�rande 2, alors le code au d�but doit �tre tout simplement :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    public static void main(String[] args) throws Exception {
     
             boolean tousentiers = arg[0].indexOf('.')==-1 && arg[2].indexOf('.')==-1; // on détermine si les 2 opérandes sont entiers (si ils le sont tous les 2, alors le résultat sera un entier, sinon ce sera un nombre à virgule (enfin à point exactement)
             try {
    	    double num1 = Double.parseDouble(args[0]); // on lit l'opérande 1 dans le paramètre 0
    		try {
    			double num2 = Double.parseDouble(args[2]); // on lit l'opérande 2 dans le paramètre 2
                            String operateur = args[1]; // on lit l'opérateur dans le paramètre 1
    			run(num1, operateur, num2, tousEntier); // on appelle la méthode qui génère le xml avec les paramètres qu'on a besoin
    		}
    		catch( NumberFormatException e) {
    			System.err.println("Erreur: le second opérande doit être un nombre !");
    		}
    	}
    	catch( NumberFormatException e) {
    		System.err.println("Erreur: le premier opérande doit être un nombre !");
    	}
    }
     
     
    private static void run(double num1, boolen operateur, double num2, boolean tousEntier)  throws Exception {
     
    double resultat;
    switch( operateur ) { // on teste l'opérateur
    case "+": // si l'opérateur est une addition
        resultat = num1 + num2; // on calcule le résultat (donc la somme des 2 nombres)
        // etc...
        break;
    }
    Et pour d�terminer la cha�ne r�sultat � mettre dans le r�sultat, il faut utiliser tousEntier pour savoir si le r�sultat doit �tre pris comme un entier ou un double au moment de la conversion en String (comme j'ai miontr� dans un de mes pr�c�dents messages). Ceci, si tu veux que le r�sultat soit coh�rent avec les op�randes. Maintenant, si tu veux simplement que si le r�sultat se termine par .0 alors on l'exporte en entier, alors il faut faire comme tu as fait l� :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    String num1s = String.valueOf(num1) ;
    if ( num1s.endsWith(".0") ) {
        num1s = num1s.substring(0, num1s.length()-2);
    }
    Tr�s bien.

    Mais :

    1. Fais une m�thode : ne r�p�te pas ce code pour num1, num2 et le r�sultat (�a fait trois r�p�tions de la m�me chose)
    2. Dans ce cas le bool�en tousEntier ne sert plus � rien : supprime-le.



    Donc je reprends ;

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
     
    public static void main(String[] args) throws Exception {
     
             try {
    	    double num1 = Double.parseDouble(args[0]); // on lit l'opérande 1 dans le paramètre 0
    		try {
    			double num2 = Double.parseDouble(args[2]); // on lit l'opérande 2 dans le paramètre 2
                            String operateur = args[1]; // on lit l'opérateur dans le paramètre 1
    			run(num1, operateur, num2); // on appelle la méthode qui génère le xml avec les paramètres qu'on a besoin
    		}
    		catch( NumberFormatException e) {
    			System.err.println("Erreur: le second opérande doit être un nombre !");
    		}
    	}
    	catch( NumberFormatException e) {
    		System.err.println("Erreur: le premier opérande doit être un nombre !");
    	}
    }
     
     
    private static void run(double num1, boolen operateur, double num2, boolean tousEntier)  throws Exception {
     
           DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
           DocumentBuilder documentBuilder = factory.newDocumentBuilder();
           Document doc = documentBuilder.newDocument();
           Element mrow = doc.createElement("math");
           mrow.setAttribute("xmlns","http://www.w3.org/1998/Math/MathML");
           doc.appendChild(mrow);
     
           // operande 1
           Element mn1 = doc.createElement("mn");
           mrow.appendChild(mn1);
           mn1.appendChild(doc.createTextNode( toString( num1 ) );
     
           // operateur
           Element mo1 = doc.createElement("mo");
           mrow.appendChild(mo1);
           mo1.appendChild(doc.createTextNode(operateur));
     
           // operande 2
           Element mn2 = doc.createElement("mn");
           mrow.appendChild(mn2);
           mn2.appendChild(doc.createTextNode( toString( num2 ) );
     
           // =
           Element mo2 = doc.createElement("mo");
           mrow.appendChild(mo2);
           mo2.appendChild(doc.createTextNode("="));
     
     
           // resultat 
           Element mnr = doc.createElement("mn");
           mrow.appendChild(mnr);
     
    switch( operateur ) { // on teste l'opérateur
    case "+": // si l'opérateur est une addition
        // on calcule le résultat (donc la somme des 2 nombres)
        mnr.appendChild(doc.createTextNode( toString( num1 + num2 ) ) );
        break;
    case "-":
        num1 - num2; // on calcule le résultat (donc la différence)
        mnr.appendChild(doc.createTextNode( toString( num1 + num2 ) ) );
        break;
    case ">";
        // on calcule le résultat (donc si num1 > num2 )
        mnr.appendChild(doc.createTextNode( toString( num1 > num2 ) ) );
        break;
    case "<";
        // on calcule le résultat (donc si num1 < num2 )
        mnr.appendChild(doc.createTextNode( toString( num1 < num2 ) ) );
        break;
     
    /* ... etc ... */
     
    }
     
    // écriture du fichier
    /* ... */
     
     
    }
     
    // on convertit un double en chaine (si le double n'a pas de décimales, alors il sort sous forme d'entier)
    private static String toString(double value) {
       String string = String.valueOf(value);
       if ( string.endsWith(".0") ) {
          string = string.substring(0, string.length()-2);
       }  
       return string;
    }
     
    // on convertit un boolean en chaine, tel que true sorte en "vrai" et false en "faux"
    private static String toString(boolean value) {
        if ( value ) {
           return "vrai";
        }
        else {
           return "faux";
        }
    }
    L'expression "�a marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le probl�me.
    La plupart des r�ponses � vos questions sont d�j� dans les FAQs ou les Tutoriels, ou peut-�tre dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement pos�e et r�dig�e et vous aurez plus de chances de r�ponses adapt�es et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'�diteur de messages).
    Nouveau sur le forum ? Consultez Les R�gles du Club.

  9. #9
    Membre actif
    Femme Profil pro
    �tudiant
    Inscrit en
    Avril 2014
    Messages
    62
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 62
    Par d�faut Comment te remercier pour tous ton temps et ton aide
    Un gros merci pour tout
    J�ai fait quelque ajustement pour le output mais tout fonctionne tr�s bien
    Encore merci pour tout
    Java avec Api Dom n'ai pas si facile a programmer que �a, il y a beaucoup de d�tail � apprendre
    ENCORE MERCI
    Ton aide, ma �t� pr�cieuse

    A la prochaine...

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Une erreur de "uninitialized value in concatenation" que je ne comprends pas.
    Par venturic dans le forum Programmation et administration syst�me
    R�ponses: 8
    Dernier message: 28/01/2011, 15h49
  2. Include provoque une erreur de d�claration
    Par rezguiinfo dans le forum EDI, CMS, Outils, Scripts et API
    R�ponses: 4
    Dernier message: 07/03/2010, 16h45
  3. R�ponses: 6
    Dernier message: 14/02/2009, 10h13
  4. Affiche une erreur de script alors qu'il n'y en a pas
    Par Mustang67 dans le forum Flash
    R�ponses: 1
    Dernier message: 11/12/2008, 20h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo