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

Java Discussion :

Problème implémentation de mon interface


Sujet :

Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2010
    Messages : 434
    Par défaut Problème implémentation de mon interface
    Bonjour à tous,

    J'ai une interface qui est comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public interface ToolInfos {
     
    	public String getToolName();
    	public String getToolVersion();
    	public List<String> getInputFiles();
    	public String getOutputFile() throws PayloadRootPathNotInitializedException;
     
    }

    Et ensuite une classe qui implémente cette interface comme ceci :



    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
    public class MaClasse implements ToolInfos{
     
        protected static IhmMaClasse _ihmMaClasse;
     
        public static void main(String[] args){
     
            _ihmMaClasse = new IhmMaClasse();
            _ihmMaClasse.setVisible(true);
     
        }
     
        public static void Prog(IhmMaClasse _ihmMaClasse){
     
            ListeConf.EcrireTxt(_ihmMaClasse.getFichier(), fichier, tt, om); 
            MaClasse iTool = new MaClasse();
            Header iHeader = new Header(iTool);
     
     
        @Override
        public String getToolName() {
    		return("Fichier");
    	}
     
        @Override
        public String getToolVersion() {
    		return ("V1.1");
    	}
     
        @Override
        public List<String> getInputFiles() {
    		ArrayList<String> iInputFiles = new ArrayList<String>();
    	        iInputFiles.add(_ihmMaClasse.getDescXXX());
    		iInputFiles.add(_ihmMaClasse.getDescYYY());
    		iInputFiles.add(_ihmMaClasse.getDescFFF());
    		return iInputFiles;
    	}
     
        @Override
        public String getOutputFile() throws PayloadRootPathNotInitializedException {
    		String iOutputFile = _ihmMaClasse.getFichier();
    		return iOutputFile;
    	}
     
    }
    Enfin voici ma classe Header :

    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
    public class Header {
     
    	protected String mSoftwareName; 
    	protected String mSoftwareVersion; 
    	protected List<String> mInputFiles; 
    	protected String mOutputFile; //Le fichier généré (de sortie)
     
    	public Header(ToolInfos aToolInfos) throws PayloadRootPathNotInitializedException{
     
    		mOutputFile = aToolInfos.getOutputFile();
    		mSoftwareName = aToolInfos.getToolName();
    		mSoftwareVersion = aToolInfos.getToolVersion();
    		mInputFiles = aToolInfos.getInputFiles();
     
            }
     
    }
    Mon problème c'est que au moment où je fais Header iHeader = new Header(iTool); dans MaClasse j'ai une exception de pointeur null à ce moment là String String iOutputFile = _ihmMaClasse.getFichier(); Enfait c'est comme si _ihmMaClasse n'était pas initialisé alors qu'il l'est dans le main de MaClasse. Je ne comprend pas trop où est le problème. N'hésitez pas à me poser des questions si vous ne comprenez pas trop mon code ou bien mon problème.

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2010
    Messages : 394
    Par défaut
    Bonjour,

    C'est quoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     _ihmMaClasse = new IhmMaClasse();
    ?

    Parce que j'ai l'impression qu'il manque des bouts dans le code que tu as posté.

    Mako.

  3. #3
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Dans ton code, on ne voit pas ou tu initialises _ihmNumConf.
    Tu peux poster ce code ?

    Pour le cas ou, je rappelle qu'en Java, une variable de classe non initialisée est initialisée automatiquement à null. Ca ne crées pas une instance par défaut. Et dans ton code, je me serais plutot attendu à voir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    protected static IhmNumConf _ihmNumConf = new IhmNumConf();

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2010
    Messages : 434
    Par défaut
    Oups pardon erreur de frappe...

    C'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    protected static IhmMaClasse _ihmMaClasse
    Mako je n'ai en effet pas posté tout mon code car il y en a trop.
    IhmMaClasse() étant le constructeur d'une classe. C'est là en fait où est initialisé IhmMaClasse

    merci de votre aide

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2010
    Messages : 394
    Par défaut
    J'ai peut-être des problèmes de vision, mais tu dis que ton erreur vient de cette ligne String iOutputFile = _ihmNumConf.getXmlListeConfText();, mais elle est où cette ligne ?

    Mako.

    Edit : Ce serait bien si tu pouvais corriger les erreurs dans le code du premier message, parce que sinon, c'est vraiment pas évident de suivre...

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2010
    Messages : 434
    Par défaut
    Arf m**** encore une erreur de copier coller.

    Il s'agit de la ligne String iOutputFile = _ihmMaClasse.getFichier();
    présent dans getOutputFile() dans MaClasse.

    Je corrige les erreurs. Merci de ta patience

  7. #7
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    1 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 190
    Par défaut
    Tu lances bien l'application via MaClasse? (autrement dit: est-ce bien le main par lequel ton appli est lancée?)

    Comme _ihmMaClasse est une variable static, si a un endroit tu la met a null tu auras le problème mentionné. Est-ce le cas?

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2010
    Messages : 434
    Par défaut
    Ah aucun endroit je met la variable static à null.

    En fait je lance le truc via un programme de test jUnit mais dans ce programme de test j'initialise bien tout ce qu'il faut (IhmMaClasse etc)

  9. #9
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2010
    Messages : 394
    Par défaut
    Est-ce que tu lances plusieurs classes de test consécutivement ?

    Tu pourrais nous montrer comment tu lances ton/tes test(s) ?

    Mako.

  10. #10
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Citation Envoyé par Leniouns Voir le message
    En fait je lance le truc via un programme de test jUnit mais dans ce programme de test j'initialise bien tout ce qu'il faut (IhmMaClasse etc)
    Le plus probable est que le probleme vienne de la. Tu peux poster le code JUnit?

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2010
    Messages : 434
    Par défaut
    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
    public class jMaClasseTest {
     
    	static String tmpDir = "";
     
    	@Before
    	public void setUp() throws Exception {
     
    		// Création du répertoire de tests
    		tmpDir = System.getProperty("java.io.tmpdir") + "jMaClasseTest\\";
    		File iDirectory = new File(tmpDir);
    		iDirectory.mkdirs();
     
    		// Extraction du fichier ressource de tests dans le repertoire temporaire
    		InputStream iContents = Thread.currentThread().getContextClassLoader().getResourceAsStream("fichier.zip");
     
    		UtilForTests.copyFile(tmpDir + "fichier.zip", iContents);
    		UtilForTests.unzipFiles(tmpDir + "fichier.zip", tmpDir);
    	}
     
    	@After
    	public void tearDown() throws Exception {
    		UtilForTests.deleteDirectory(new File(tmpDir));
     
    	}
     
    	@Test
    	public void testProg() throws FileNotFoundException, IOException, JDOMException {
     
    		EquipePaths iEquipePaths = EquipePaths.getInstance();
    		iEquipePaths.setPayloadRootPath(tmpDir + "fichier");
     
    		// Initialisation de l'interface
    		IhmMaClasse iIhmMaClasse = new IhmMaClasse();
    		try {
     
    			// Entrées
    			iIhmMaClasse.setDescXXX(iEquipePaths.getDescXXXDefaultPath());
    			iIhmMaClasse.setDescXXXConf(iEquipePaths.getDescMaClasseDefaultPath());
    			iIhmMaClasse.setDescXXXTest(iEquipePaths.getDescXXXTestDefaultPath());
     
    			//Sorties
    			iIhmMaClasse.setFichier(iEquipePaths.getFichier());
    			iIhmMaClasse.setFicConf(iEquipePaths.getXXXDefaultPath());
     
    			// Options
    			iIhmMaClasse.setOnRenumérote(true);			
     
    			// Exécution du métier
    			jMaClasse.Prog(iIhmMaClasse);
     
    			// Validation
     
    			// Fichier résultat
    			File iFichier = new File(iEquipePaths.getXXXDefaultPath());
     
    			// Vérifier que le fichier est créé
    			assertEquals(true, iFichier.exists());
     
    			// Fichier attendu
    			InputStream iContents = Thread.currentThread().getContextClassLoader().getResourceAsStream("XXX.txt");
    			UtilForTests.copyFile(tmpDir + "XXX.txt", iContents);
     
    			// Vérifier que le contenu est correct
    			boolean identiques = UtilForTests.compareTextFiles(new File(tmpDir + "XXX.txt"), iFichier);
     
    			assertEquals(true, identiques);		
     
    		} catch (PayloadRootPathNotInitializedException e) {
    			e.printStackTrace();
    		}
     
    	}
     
    }

    Après le truc c'est que je ne sais pas si c'est utile... Car j'ai pas pu mettre tout le code de la classe MaClasse, il y a trop de lignes et j'ai voulu mettre l'essentiel...

    Merci de ton aide en tout cas

  12. #12
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2010
    Messages : 394
    Par défaut
    Bonjour,

    Tout d'abord, deux petites remarques indépendantes de ton problème :
    - En l'état, tu créés et détruits ton répertoire de test entre chaque classe de test (@before et @after). Si tu n'as qu'une seule classe de test, ce n'est pas grave, mais si tu en as plusieurs, il serait mieux d'utiliser des méthodes avec @beforeClass et @afterClass (executées respectivement avant le chargement de la classe, donc avant le premier test, et après le dernier test) ;
    - Au lieu de faire des Assert.assertEquals(true, blabla);, tu peux directement utiliser Assert.assertTrue(blabla); (idem avec false bien entendu), c'est plus lisible ;

    Pour en revenir au problème initial :

    Le soucis vient du fait que tu as deux "iIhmMaClasse". Celui que tu définis et instancies dans ta classe de test, et celui qui est rattaché à ta classe MaClasse (en tant qu'attribut static), qui lui est null, car en lancant ton test tu ne passes pas dans la méthode main.

    Mako.

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2010
    Messages : 434
    Par défaut
    Merci de ton aide.

    Mais du coup je ne vois pas trop comment je peux faire

  14. #14
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2010
    Messages : 394
    Par défaut
    A voir si c'est adaptable dans ton code concrètement, mais vu les infos que tu as mises ici, tu pourrais modifier ta classe MaClasse comme suit :

    Code MaClasse.java : 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
     
    public class MaClasse implements ToolInfos{
     
        protected static IhmMaClasse _ihmMaClasse;
     
        public static void main(String[] args){
            // On externalise l'initialisation dans une methode prevue a cet effet
            initialisation();
        }
     
        // NOUVEAU
        public static void initialisation() {
             _ihmMaClasse = new IhmMaClasse();
            _ihmMaClasse.setVisible(true);
        }
     
        // NOUVEAU
        // Permet de recupere l'instance de _ihmMaClasse
        public static IhmMaClasse getIhmMaClasse() {
            return _ihmMaClasse;
        }
     
        // A priori, il n'y a pas besoin de passer d'arguments a cette methode
        public static void Prog(){
            ListeConf.EcrireTxt(_ihmMaClasse.getFichier(), fichier, tt, om); 
            MaClasse iTool = new MaClasse();
            Header iHeader = new Header(iTool);
        }
     
        // Le reste est inchange 
    }

    Et dans le code de ton JUnit, tu remplaces IhmMaClasse iIhmMaClasse = new IhmMaClasse(); par :

    Code JUnit : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // Initialisation de l'attribut _ihmMaClasse
    MaClasse.initialisation();
    // On travaille sur cet attribut a partir de la
    IhmMaClasse _ihmMaClasse = MaClasse.getIhmMaClasse();

    Ceci est une ébauche, certains points peuvent sans doute encore être améliorés...

    Mako.

  15. #15
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    A mon avis, le mieux, c'est de virer cet attibut static qui n'a pas l'air de servir à grand chose (d'apres le code que tu montres, il est instancié à chaque fois). Et si ca sert vraiment, utilise plutot un singleton, ca evitera les problemes...
    Ensuite, dans ton code, il suffit de remplacer tous les "_ihmMaClasse" par "this"

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2010
    Messages : 434
    Par défaut
    Merci pour vos réponses

Discussions similaires

  1. Problème Automate dans mon interface
    Par taitai83 dans le forum Général Java
    Réponses: 0
    Dernier message: 15/10/2009, 09h53
  2. [C# 3.0] Problème implémention explicite d'interfaces
    Par LE NEINDRE dans le forum Windows Forms
    Réponses: 1
    Dernier message: 28/10/2008, 13h44
  3. [MySQL] problème dans mon interface admin
    Par ni.co dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 22/05/2008, 11h41
  4. énorme problème avec mon interface MFC
    Par cenedra dans le forum MFC
    Réponses: 23
    Dernier message: 17/07/2006, 09h36
  5. énorme problème avec mon interface MFC
    Par cenedra dans le forum C++
    Réponses: 2
    Dernier message: 12/07/2006, 09h54

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