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

avec Java Discussion :

Explication sur les méthodes


Sujet :

avec Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2018
    Messages : 59
    Points : 26
    Points
    26
    Par défaut Explication sur les méthodes
    Bonjour,

    Je vous contacte pour un petit problème que je n'arrive pas à résoudre.

    Mon programme a pour but, via une IHM de construire un fichier XML. La personne qui est devant l'IHM fait des choix dans des listes déroulantes et en fonction des choix, le fichier XML se construit.

    Au final, mon programme construit un assez grand fichier XML, et je n'arrive pas forcément à me retrouver dedans.

    Pour le moment, tout mon programme qui construit le fichier XML se trouve dans une seule méthode, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private void ChouetteMachineChoseActionPerformed(java.awt.event.ActionEvent evt)
    Cependant, pour faciliter la compréhension de mon programme et pouvoir le modifier plus facilement, j'aimerai créer plus parties comme par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private void ChouetteMachineChoseActionPerformed(java.awt.event.ActionEvent evt){
    Chouette1;
    Chouette2;
    }
    private void Chouette1(){}
    private void Chouette2(){}
    J'ai essayer de déplacer une partie de ma partie globale vers une autre partie sauf que j'ai plein d'erreurs. Comme par exemple, il ne reconnait pas la librairie XML.

    Il est possible que l'erreur proviennes du "private" mais je n'arrive pas à l'enlever !

    Nom : Sans titre.png
Affichages : 173
Taille : 5,2 Ko

    Pour information, je programme sous Netbeans.
    Si vous voulez plus de détails pour m'aider, n'hesitez pas.

    Merci beaucoup, vraiment.

  2. #2
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Les parenthèse sont toujours obligatoires lors d'un appel de méthode en java (même quand y'a pas de paramètres):

    Change
    ... avec ça:
    sinon pour le reste, bin on a pas beaucoup d'infos ni de code.... Si il ne reocnnait pas la librairie xml, explique ce que tu as fais pour changer cela

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2018
    Messages : 59
    Points : 26
    Points
    26
    Par défaut
    Alors c'est un peu plus difficile que ça, j'ai du mal expliquer !

    Dans ma partie globale, j'ai toute la création du fichier XML :

    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
     
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
     
    try {
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document xml = builder.newDocument(); //Création du fichier
    Element root = xml.createElement("conf"); //Création de notre élément racine 
     
    //Fichier XML créer
     
    Transformer t = TransformerFactory.newInstance().newTransformer();
    t.setOutputProperty(OutputKeys.VERSION, "1.0");
    t.setOutputProperty(OutputKeys.INDENT, "yes");
    // appliquer la transformation
    String resultFile = "fichier.xml";
    StreamResult XML = new StreamResult(resultFile);
    t.transform(new DOMSource(root), XML);
    } catch (DOMException | ParserConfigurationException | TransformerFactoryConfigurationError | TransformerException abc) {
    }
    Sauf qu'il y a beaucoup de ligne dans cette partie de programme pour le fichier XML.

    J'ai donc essayer de prendre par exemple une partie de ce programme et de le mettre dans une méthode.

    Cependant, quand je fais ceci, j'obtiens les erreurs suivantes :

    Nom : 2018-09-25 08_23_41-E2_TEST_1 - NetBeans IDE 8.2.png
Affichages : 148
Taille : 7,1 Ko

    Selon moi, étant donnée que les deux "void" sont en private, la libraire XML n'est pas partagé...

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2018
    Messages : 59
    Points : 26
    Points
    26
    Par défaut
    J'essaye certaine chose et je me demande pourquoi j'ai cette erreur là :

    Nom : Capture.PNG
Affichages : 147
Taille : 6,3 Ko

  5. #5
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Alors, plusieurs trucs:

    1. je constate que ton catch est vide. C'est à mon sens, l'une des pire chose possible en Java toujours mettre au minimum, e.printStackTrace() dans le catch. Sinon ça risque de planter et tu ne le sauras même pas.
    Citation Envoyé par tomlrt53 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    } catch (DOMException | ParserConfigurationException | TransformerFactoryConfigurationError | TransformerException abc) {
        abc.printStackTrace(); // AU MINIMUM!
    }
    *EDIT:* en plus, Dieu tue des châtons à chaque fois que tu fais ça....

    bon ça pour que ça serve il faut déjà que ça compile...

    2. ensuite:

    Citation Envoyé par tomlrt53 Voir le message
    Selon moi, étant donnée que les deux "void" sont en private, la libraire XML n'est pas partagé...
    Euh "la librairie xml n'est pas chargée" ça donnerait des erreur du genre ClassNotFoundException ou NoClassDefFoundError. Là, on a un problème de définition de variable. Il ne trouve pas la variable "xml" dans le scope accessible. Le private sur les méthodes ne changera rien (d'ailleurs, tu auras certainement constaté que rien ne change même si tu mets "public").

    *EDIT:* 'scuse j'ai lu "chargée" au lieu de "partagée". Alors oui, mais on va parler de "variable", la "librairie" étant plutôt l'outil sous-jacent qui te permet de manipuler le format xml: dans notre cas, les apis xml native de Java

    De ce que j'ai compris, tu as extrait une partie du code dans une autre classe, correct? Et bien dans ce cas, il faut "utiliser" cette classe, soit via la création d'une variable du type correspondant, soit via l'appel de ses méthodes static:

    Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public class Xml {
      // plein de fonction "public static"
      // plein de méthodes "public"
    }
    Dans ta classe qui a besoin de la fonctionnalité, tu peux invoquer le code de la class "Xml" comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // public ou private, la visibilité de la méthode faisant l'appel n'est pas important
    void m() {
        // en mode "procédural"
        Xml.invoquerQuelqueChoseDePublicStatic(); 
     
        // en mode "object"
        Xml xml = new Xml();
        xml.invoquerQuelqueChoseDePublicEtPasStatic();
    }
    Voili, ça devrait te permettre de corriger tes erreurs de compil'

    Et 3., NetBeans te dit que tu essaie d'exécuter une classe qui ne contient pas de "public static void main(String[])" et qui donc, n'est pas exécutable.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2018
    Messages : 59
    Points : 26
    Points
    26
    Par défaut
    Je dois t'avouer que j'ai pas tout compris.. Désolé.. Je me re-explique même si je pense que tu as compris le problème que j'ai.

    J'ai une partie globale qui est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private void BiduleActionPerformed(java.awt.event.ActionEvent evt)
    J'ai dans cette partie, la création de mon fichier XML :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    try {
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document xml = builder.newDocument(); //Création du fichier
    Après ceci, je donne la structure de mon fichier XML et je le remplis comme je le souhaite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Element root = xml.createElement("conf"); //Création de notre élément racine 
     
    Element chose= xml.createElement("chose");  Element element1= xml.createElement("element1"); Element element2= xml.createElement("element2");
    Element element3= xml.createElement("element3"); Element element4= xml.createElement("element4"); machine.appendChild(element2);
    machine.appendChild(element1); machine.appendChild(element3); machine.appendChild(element4); root.appendChild(chose);
     
    element1.setAttribute("hibou","1"); element2.setAttribute("chouette","2"); element3.setAttribute("oiseau", "3");
    element4.setAttribute("corbeau","4");
    Cependant, c'est cette structure et ce remplissage qui est beaucoup trop long.

    J'aimerai donc mettre une partie de celui-ci dans une méthode par exemple. Et quand je fais appel à cette méthode, mon fichier XML se remplis avec ce qu'il y a dedans.

    Voici ce que j'aimerai avoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    private void Conf_MachineActionPerformed(java.awt.event.ActionEvent evt){
    Partie1();
    Partie2();
    partie3();
    }
    void Partie1(){
    Element fefe = xml.createElement("fefe");
    fefe.appendChild(chose);
    fefe.setAttribute("fegeg");
    }
    Je ne sais pas si c'est un peu plus compréhensible.. En tout cas, quand je fais comme ça, j'ai le problème de variable xml non défini

  7. #7
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Conseil: part d'une version qui compile, et dans netbeans tu sélectionnes le bloc que tu veux extraire, puis dans "Refactoring" tu cherches "Extract method". Netbeans s'occupera du reste, puis tu pourras mieux comprendre ce qui ne jouait pas avant...

    Parce que là, sans code complet et avec des termes un peu... approximatifs , impossible de comprendre ce que tu essaies de faire et ce qui pose réellement problème...

  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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Citation Envoyé par tomlrt53 Voir le message

    Voici ce que j'aimerai avoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    private void Conf_MachineActionPerformed(java.awt.event.ActionEvent evt){
     
    Partie1();
    Partie2();
    partie3();
     
    }
    void Partie1(){
    Element fefe = xml.createElement("fefe");
    fefe.appendChild(chose);
    fefe.setAttribute("fegeg");
    }
    Je ne sais pas si c'est un peu plus compréhensible.. En tout cas, quand je fais comme ça, j'ai le problème de variable xml non défini
    Pour une refactorisation, à la main (donc sans utiliser un outil de refactoring) : dans Partie1() tu cherches à utiliser une variable déclarée localement à la méthode Conf_MachineActionPerformed, ce qui n'est pas possible (la variable xml est locale à cette méthode et ne peut être vue dans d'autres méthodes, excepté s'il s'agit d'une méthode d'une classe locale ou interne à la méthode elle-même). Pour pouvoir utiliser la référence de l'objet que cette variable pointe, il suffit de la passer en paramètre :


    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
     
    private void Conf_MachineActionPerformed(java.awt.event.ActionEvent evt){
     
    /**...**/
    Document xml = builder.newDocument(); //Création du fichier
     
    Partie1(xml);
    Partie2(xml);
    partie3(xml);
     
    }
    void Partie1(Document xml) {
    Element fefe = xml.createElement("fefe");
    fefe.appendChild(chose);
    fefe.setAttribute("fegeg");
    }
    1. Déclarer chaque sous partie (méthode donc) avec l'instance de Document en paramètre (et éventuellement d'autres paramètres correspondant à des variables locales de Conf_MachineActionPerformed)
    2. Pour chaque appel, passer la (ou les) variable(s) nécessaire(s)...


    Sache que tu peux également créer des méthodes utilitaires qui te permettrons de raccourcir la méthode principale ou chaque sous-méthode.

    Par exemple, on pourrait écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public static Element createElement(Document xml, String name, Map<String, String> attributes) {
    Element element = xml.createElement(name);
    for(Map.Entry<String, String> entry : attributes.entrySet() ) {
        element.setAttribute(entry.getKey(), entry.getValue());
    }
    return element;
    }
    public static void appendChild(Element parent, Element...children) {
         // attention, les enfants doivent avoir été crée par le même document que celui qui a servi pour créer le parent, ou il faudra importer l'enfant dans le document du parent
         for(Element child : children) {
           parent.appendChild(child );
         }
    }
    /*...etc...*/
    Il y a aussi d'autres API plus pratiques pour créer du XML (et qui permette de réduire le code), internes au JDK ou externes : JDOM2, StAX.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2018
    Messages : 59
    Points : 26
    Points
    26
    Par défaut
    D'accord, je comprends bien cette partie,
    Salut,

    Voici ce que j'aimerai avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    private void Conf_MachineActionPerformed(java.awt.event.ActionEvent evt){
     
    Partie1();
    Partie2();
    partie3();
     
    }
    void Partie1(){
    Element fefe = xml.createElement("fefe");
    fefe.appendChild(chose);
    fefe.setAttribute("fegeg");
    }
    Je ne sais pas si c'est un peu plus compréhensible.. En tout cas, quand je fais comme ça, j'ai le problème de variable xml non défini
    Pour une refactorisation, à la main (donc sans utiliser un outil de refactoring) : dans Partie1() tu cherches à utiliser une variable déclarée localement à la méthode Conf_MachineActionPerformed, ce qui n'est pas possible (la variable xml est locale à cette méthode et ne peut être vue dans d'autres méthodes, excepté s'il s'agit d'une méthode d'une classe locale ou interne à la méthode elle-même). Pour pouvoir utiliser la référence de l'objet que cette variable pointe, il suffit de la passer en paramètre :

    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
    private void Conf_MachineActionPerformed(java.awt.event.ActionEvent evt){
     
    /**...**/
    Document xml = builder.newDocument(); //Création du fichier
     
    Partie1(xml);
    Partie2(xml);
    partie3(xml);
     
    }
    void Partie1(Document xml) {
    Element fefe = xml.createElement("fefe");
    fefe.appendChild(chose);
    fefe.setAttribute("fegeg");
    }
    Déclarer chaque sous partie (méthode donc) avec l'instance de Document en paramètre (et éventuellement d'autres paramètres correspondant à des variables locales de Conf_MachineActionPerformed)
    Pour chaque appel, passer la (ou les) variable(s) nécessaire(s)...
    Cependant ça ne fonctionne pas ! Je n'ai aucune erreur, cependant, lorsque mon fichier XML se créer, la partie qui est dans une méthode à part (donc Partie1) n'est pas intégrée.

  10. #10
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par tomlrt53 Voir le message
    Cependant ça ne fonctionne pas ! Je n'ai aucune erreur, cependant, lorsque mon fichier XML se créer, la partie qui est dans une méthode à part (donc Partie1) n'est pas intégrée.
    La méthode partie1() crée un élément, mais il faut l'ajouter à un parent, sinon il n'existe pas dans le document. Je t'ai donné le principe, en copiant ton exemple. Il te faut l'adapter pour passer l'ensemble des variables nécessaires et ajouter ce qu'il faut, comme l'élément parent, celui auquel l'élément fefe va être ajouté (en particulier, il y a une variable chose qui n'est pas déclarée, donc ça ne devrait même pas compiler, sauf si tu as déclaré cette variable en membre de classe, ce qui n'est pas une bonne idée). Globalement, tu ne devrais avoir qu'à déplacer ton code actuel, et ajouter en tant que paramètre les variables signalées comme inconnues, puis compléter les appels.

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2018
    Messages : 59
    Points : 26
    Points
    26
    Par défaut
    Ca m'a l'air de fonctionner, merci beaucoup !!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [NTFS]explication sur les type de droits
    Par arnolem dans le forum Sécurité
    Réponses: 6
    Dernier message: 19/04/2006, 12h52
  2. Explication sur les licences Windows
    Par winow dans le forum Autres Logiciels
    Réponses: 19
    Dernier message: 07/04/2006, 16h34
  3. Besoin d'explications sur les charset
    Par EGPMS dans le forum SQL Procédural
    Réponses: 7
    Dernier message: 03/02/2006, 15h38
  4. [RegEx] preg_replace : explications sur les caractères spéciaux
    Par Anduriel dans le forum Langage
    Réponses: 6
    Dernier message: 05/10/2005, 21h35
  5. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 22h18

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