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 :

Faire un EXIT propre


Sujet :

Java

  1. #1
    Membre chevronné Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Par défaut Faire un EXIT propre
    Bonjour,

    Je suis en cours de développement d'une application dont la classe qui contient le main possède grosomodo 3 méthodes principales:

    - init()
    - launchWindow()
    - finalize()

    Dans init(), j'ouvre pas mal de flux notamment des sockets.
    Dans launchWindow(), je crée la fenetre graphique.
    Dans finalize(), je libère les ressources utilisées (et initialisées dans init()).

    Si je code de la facon suivante, ca plante:

    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 final class Appli {
    
    	public final static void main(String[] args) {
    		Appli appli = new Appli();
    
    		appli.init();
    		appli.launchWindow();
    
    		appli.finalize(); <--- PROBLEME!!!
    	}
    
    	public Appli() {}
    
    	public void init() { ... }
    	public void launchWindow() { ... }
    	public void finalize() { ... }
    }
    La raison est surement parce que launchWindow() n'est pas bloquant. finalize est tout de suite appelée apres launchWindow() et donc j'ai un nullPointerException


    Je ne vois pas comment m'en sortir... Peut etre est ce du à une mauvaise conception...


    Si vous avez des idées ou propositions pour résoudre mon problème, je suis preneur!!


    Merci d'avance,

    Billy

  2. #2
    Membre Expert Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Par défaut
    C'est dans ta methode finalize qu'il y a un nullPointer.

    Regarde bien la stackTrace de ton plantage et va à la ligne indiqué.

    NUllPointer => Signifie que tu appel une methode sur un object null

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String s = null;
    s.indeOf("1"); // <= la il va y avoir un nullPointer

  3. #3
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Il faut que tu appelles finalize() à la fermeture de ta fenêtre, pour cela, il faut que tu ajoutes un WindowListener et que lors de la l'appel de la méthode windowClosing, tu appelles finalize().

  4. #4
    Membre chevronné Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Par défaut
    J'ai un windowListener dans la classe correspondant à ma fenetre. Je dois également ajouter cette implémentation dans ma classe Appli ?

  5. #5
    Membre chevronné Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Par défaut
    J'ai essayé mais cela ne marche pas. je n'y arrive pas!

    J'ai vérifié les logs Eclipse et le nullPointerException apparait dans l'appli lorsque je veux envoyer des données sur la socket [socket is null] (la méthode qui cradosse se trouve dans la classe qui étend JFrame)

  6. #6
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 398
    Par défaut
    Citation Envoyé par billynirvana
    J'ai essayé mais cela ne marche pas. je n'y arrive pas!

    J'ai vérifié les logs Eclipse et le nullPointerException apparait dans l'appli lorsque je veux envoyer des données sur la socket [socket is null] (la méthode qui cradosse se trouve dans la classe qui étend JFrame)
    t'aas une classe qui étend de JFrame
    dans le constructeur de ta classe, lorsque tu définis la fenetre, a la fin, tu appelles initialise
    tu appelles ensuite launchWindow
    dans ta classe, tu définis un WindowListener pour la fermeture de ta fenetre
    c'est la que tu mettras le finalize()

  7. #7
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Attention, il est fortement recommandé de ne PAS utiliser la méthode finalize() pour libérer des ressources.
    En effet, il n'est pas garantie que celle-ci soit appelée. Et si tu l'appelle explicitement (chose qu'il ne faut pas faire), il peut y avoir des problèmes si elle est réappelée lors de la destruction de l'objet (par exemple tentative d'un flux déjà fermé lors du précédent appel à finalize()).

    Il vaut mieux écrire une méthode par toi même, par exemple nommée exit(), qui s'occupe de libérer les ressources (ou tout autre tâche de ton choix).
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  8. #8
    Membre chevronné Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Par défaut
    Ca ne me gene pas de renommer la méthode finalize en exit car elle n'existe pas dans la classe Object.

    En fait, je crois que vous vous êtes embrouillé tout seul, ou que je me suis mal exprimé.

    Voilà à quoi ressemble mes 2 principales classes. Les autres classes sont juste des composants swing customizés.

    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
    public class Appli extends Object {
    
    	public final static void main(String[] args) {
    		Appli appli = new Appli();
    
    		appli.init();
    		appli.launchWindow();
    
    		appli.finalize(); <-- PROBLEME
    	}
    
    	private void init() {
    		// ouverture socket
    
    	}
    
    	private void finalize() {
    		// fermeture socket
    	}
    
    	private void launchWindow() {
    		new AppliWindow();
    	}
    
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class AppliWindow extends JFrame implements WindowListener, ActionListener {
     
    	public AppliWindow() {
    		// initialisation des composants graphiques + listener
    	}
     
    	// insertion des méthodes obligatores par les implementations
    	public void windowClosing(WindowEvent arg0) { // par exemple
    		dialogueBox("Vous nous quittez déjà?");
    		...
    	}
    }

    J'ai essayé de faire en sorte que Appli implemente aussi WindowListener, mais je n'ai pas obtenu satisfaction...

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 361
    Par défaut
    Salut,

    Ca veut dire quoi "je n'ai pas obtenu satisfaction..." ?

    Tu fais bien un addWindowListener(this), quelque part dans le code de AppliWindow ?
    Et penses à faire un setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE), sur ta fenêtre.

    Tu peux aussi voir du côté des fonctions wait() et notify(), si tu veux garder ta "façon de faire".
    Tu bloques au niveau de launchWindow, puis tu débloques quand il faut fermer.

    P.S: la méthode windowClosing est appelée quand la fenêtre reçoit l'ordre de se fermer, et windowClosed quand la fenêtre est fermée.

  10. #10
    Membre chevronné Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Par défaut
    Je n'ai pas obtenu satisfaction signifie que

    - Soit je dois passer en argument l'instance de Appli dans le constructeur de AppliWindow afin de pouvoir appeler la methode finalize dans WindowClosed (qd l'evenement de fermeture de fenetre se produit). Ca ne me plaisait pas comme conception.

    - J'ai essayé d'ajouter un addWindowListener(---) dans Appli mais Eclipse refuse de me compiler.


  11. #11
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Tu peux utiliser un shutdown hook :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	Runtime.getRuntime().addShutdownHook(new Thread() {
    		@Override
    		public void run() {
    			// Code a exécuter à la fermeture du programme
    		}
    	});
    Par contre tu ne devrais pas utiliser le nom "finalize()" qui est utilisé par le GC...

    a++

  12. #12
    Membre chevronné Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Par défaut Ouaiii!!!!!!
    Bon, j'ai réussi avec les WindowListener. En fait j'avais utilisé windowClosing au lieu de windowClosed

    Voici l'essentiel des opérations:

    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
    public class Appli extends Object implements WindowListener {
     
    	public final static void main(String[] args) {
    		Appli appli = new Appli();
     
    		appli.init();
    		appli.launchWindow();
    	}
     
    	private void init() {
    		// ouverture socket
     
    	}
     
    	private void cleanExit() {
    		// fermeture socket
    	}
     
    	private void launchWindow() {
    		AppliWindow appWindow = new AppliWindow();
    		appWindow.addWindowListener(this);
    	}
     
    	public void windowClosed(WindowEvent arg0) {
    		cleanExit();
    	}
     
    	public void windowOpened(WindowEvent arg0) {}
    	public void windowClosing(WindowEvent arg0) {}
    	public void windowIconified(WindowEvent arg0) {}
    	public void windowDeiconified(WindowEvent arg0) {}
    	public void windowActivated(WindowEvent arg0) {}
    	public void windowDeactivated(WindowEvent arg0) {}
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class AppliWindow extends JFrame {
     
    	public AppliWindow() {
    		...
    		/** non autorisation de la fermeture de la fenetre avec ALT-F4 */
    		this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    		...
    	}
    }
    @adiguba: Cela marche également avec ton astuce.


    MERCI A TOUS!




    Billy

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

Discussions similaires

  1. [windows mobile] faire une appli propre
    Par crischprolch dans le forum Windows
    Réponses: 3
    Dernier message: 14/07/2008, 21h35
  2. Userform faire du code propre
    Par lipaika dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 07/01/2008, 11h36
  3. Réponses: 7
    Dernier message: 14/12/2007, 09h02
  4. Faire un Exit Function
    Par Poussy-Puce dans le forum ASP.NET
    Réponses: 6
    Dernier message: 16/01/2007, 06h58
  5. [Débutant] Faire un exit avec &
    Par thybo dans le forum C++
    Réponses: 7
    Dernier message: 23/11/2004, 20h33

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