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

SWT/JFace Java Discussion :

NullPointerException sur du code SWT basique


Sujet :

SWT/JFace Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 91
    Points : 47
    Points
    47
    Par défaut NullPointerException sur du code SWT basique
    Bonjour,

    j'ai une exception qui survient à un endroit inattendu et que je ne comprend pas. J'ai pendant longtemps développé mon programme sans problème et j'ai maintenant de gros problème de stabilité.

    Voici le bout de code d'où vient l'exception :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    shell.open();
     
    while (!shell.isDisposed ()) {
    	if (!shell.getDisplay().readAndDispatch ()) shell.getDisplay().sleep ();		
    }		
    display.dispose();
    C'est plutôt basique comme code SWT et voici l'exception :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    java.lang.NullPointerException
    	at org.eclipse.swt.widgets.Control.sendMouseEvent(Control.java:2906)
    	at org.eclipse.swt.widgets.Display.checkEnterExit(Display.java:557)
    	at org.eclipse.swt.widgets.Shell.windowSendEvent(Shell.java:1784)
    	at org.eclipse.swt.widgets.Display.windowProc(Display.java:4713)
    	at org.eclipse.swt.internal.cocoa.OS.objc_msgSendSuper(Native Method)
    	at org.eclipse.swt.widgets.Display.applicationSendEvent(Display.java:4285)
    	at org.eclipse.swt.widgets.Display.applicationProc(Display.java:4352)
    	at org.eclipse.swt.internal.cocoa.OS.objc_msgSend(Native Method)
    	at org.eclipse.swt.internal.cocoa.NSApplication.sendEvent(NSApplication.java:101)
    	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3097)
    	at fr.loria.talaris.MlifTranslator.vue.MainWindow.<init>(MainWindow.java:74)
    	at fr.loria.talaris.MlifTranslator.main.Main.main(Main.java:23)
    La ligne 74 est la ligne contenant le IF.

    Je ne comprend pas d'où peut venir cette exception, si quelqu'un à une idée merci de m'aider :s

  2. #2
    Membre extrêmement actif Avatar de jojodu31
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Points : 814
    Points
    814
    Par défaut
    Bonjour,
    déjà (ça ne change rien mais bon) utilise directement le display :
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    		shell.open();
    		while (!shell.isDisposed()) {
    			if (!display.readAndDispatch()) {
    				display.sleep();
    			}
    		}
    		display.dispose();

    ensuite pourrait on avoir le code complet pas juste la fin....

    jojodu31
    Heureux soient les fêlés, car ils laisseront passer la lumière.

    Mieux vaut fermer sa gueule et passer pour un con que l'ouvrir et ne laisser aucun doute à ce sujet.

    Cours et tutoriels pour apprendre Java , FAQ Java, et Forum Java

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 91
    Points : 47
    Points
    47
    Par défaut
    Quelle partie du code? Il fait environ 1000 lignes

    Si tu veux l'ensemble de la méthode la voici mais je ne pense pas que ça aide beaucoup.

    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 MainWindow(Display display){
    	Shell shell = initShell(display);
    	window = shell;
    	initMenuBar(shell);
    	initCommand(shell);
    	initTabFolder(shell);
     
    	shell.open();
     
    	while (!shell.isDisposed ()) {
    		if (!shell.getDisplay().readAndDispatch ()) shell.getDisplay().sleep ();
    	}
    	display.dispose();
    }

  4. #4
    Membre extrêmement actif Avatar de jojodu31
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Points : 814
    Points
    814
    Par défaut
    Quelle partie du code? Il fait environ 1000 lignes
    je vois...

    tu es passé en debug je suppose pour voir la valeur de display quand tu fais ton Shell shell = initShell(display) ?... voir aussi dans le contenu de cette méthode initShell ...
    Heureux soient les fêlés, car ils laisseront passer la lumière.

    Mieux vaut fermer sa gueule et passer pour un con que l'ouvrir et ne laisser aucun doute à ce sujet.

    Cours et tutoriels pour apprendre Java , FAQ Java, et Forum Java

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 91
    Points : 47
    Points
    47
    Par défaut
    J'ai testé la valeur de Display un peut partout y compris dans le while. Et même dans le while juste avant le plantage sa valeur n'est jamais null. C'est je suppose une variable de ce Display qui prend une valeur null mais je ne connais pas assez bien la classe pour repérer de laquelle il s'agit.

    Au vu de l'Exception générée je suppose que c'est dans la méthode checkEnterExit de Display ou sendMouseEvent de Control.

    Cependant je ne manipule à aucune moment un MouseEvent c'est pour ça que je ne comprend pas :s

    Edit : j'ai réussi à isoler l'emplacement du problème. C'est donc bien dans la méthode sendMouseEvent :

    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
    boolean sendMouseEvent (NSEvent nsEvent, int type, boolean send) {
    	Shell shell = null;
    	Event event = new Event ();
    	switch (type) {
    		case SWT.MouseDown:
    			shell = getShell ();
    			//FALL THROUGH
    		case SWT.MouseUp:
    		case SWT.MouseDoubleClick:
    		case SWT.DragDetect:
    			int button = (int)/*64*/nsEvent.buttonNumber();
    			switch (button) {
    				case 0: event.button = 1; break;
    				case 1: event.button = 3; break;
    				case 2: event.button = 2; break;
    				case 3: event.button = 4; break;
    				case 4: event.button = 5; break;
    			}
    			break;
    		case SWT.MouseWheel:
    			event.detail = SWT.SCROLL_LINE;
    			float /*double*/ delta = nsEvent.deltaY();
    			event.count = delta > 0 ? Math.max (1, (int)delta) : Math.min (-1, (int)delta);
    			break;
    	}
    	if (event.button != 0) event.count = (int)/*64*/nsEvent.clickCount();
    	NSPoint windowPoint;
    	NSView view = eventView ();
    	if (nsEvent == null || nsEvent.type() == OS.NSMouseMoved) {
    		NSWindow window = view.window();
    		windowPoint = window.convertScreenToBase(NSEvent.mouseLocation()); 
    	} else {
    		windowPoint = nsEvent.locationInWindow();
    	}
    	NSPoint point = view.convertPoint_fromView_(windowPoint, null);
    	if (!view.isFlipped ()) {
    		point.y = view.bounds().height - point.y;
    	}
    	event.x = (int) point.x;
    	event.y = (int) point.y;
    	setInputState (event, nsEvent, type);
    	if (send) {
    		sendEvent (type, event);
    		if (isDisposed ()) return false;
    	} else {
    		postEvent (type, event);
    	}
    	if (shell != null) shell.setActiveControl(this);
    	return event.doit;
    }
    Plus précisément encore le problème est ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (nsEvent == null || nsEvent.type() == OS.NSMouseMoved) {
    	NSWindow window = view.window();
    	windowPoint = window.convertScreenToBase(NSEvent.mouseLocation()); 
    }
    La variable window vaut null. Est ce que ça pourrait venir du fait que j'utilise moi même une variable window?

  6. #6
    Membre extrêmement actif Avatar de jojodu31
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Points : 814
    Points
    814
    Par défaut
    je pense que ça n'a rien à voir. Je viens de voir qq chose que je n'avais pas remarqué... l'erreur vient de l'initialisation de la classe MainWindow :
    fr.loria.talaris.MlifTranslator.vue.MainWindow.<init>
    ton MainWindow fait un extends de quelque chose ? redéfini tu des méthodes ? initialise tu les attributs d'instance à null ?
    Heureux soient les fêlés, car ils laisseront passer la lumière.

    Mieux vaut fermer sa gueule et passer pour un con que l'ouvrir et ne laisser aucun doute à ce sujet.

    Cours et tutoriels pour apprendre Java , FAQ Java, et Forum Java

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 91
    Points : 47
    Points
    47
    Par défaut
    Non je n'hérite de rien. En fait j'ai écris un peut trop vite le code que j'ai donné n'est pas une méthode c'est le constructeur de cette classe.

    Pour les attributs d'instances oui j'en déclare certains à null. Par contre avant de les utiliser dans une méthode ils sont toujours testés.

    Je suis quand même assez étonné par ce problème, je me demande si il ne viendrait pas de l'environnement. Dans le doute de vais redémarrer ma machine on ne sait jamais avec l'informatique :s

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 91
    Points : 47
    Points
    47
    Par défaut
    J'ai redémarré et effectué quelques test. Pour le moment le problème n'est pas revenu.

    Je vais donc continuer le développement et faire des tests poussés une fois que le tout sera terminé.

    Merci pour ton aide !!!

  9. #9
    Membre extrêmement actif Avatar de jojodu31
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Points : 814
    Points
    814
    Par défaut
    arg je n'ai pas fait grand chose, mais il est vrai que parfois un bon reboot règle tous les pb sans trop qu'on sache pourquoi... peut être à bientot donc
    Heureux soient les fêlés, car ils laisseront passer la lumière.

    Mieux vaut fermer sa gueule et passer pour un con que l'ouvrir et ne laisser aucun doute à ce sujet.

    Cours et tutoriels pour apprendre Java , FAQ Java, et Forum Java

Discussions similaires

  1. Questions sur le code
    Par Pedro dans le forum Sepi
    Réponses: 5
    Dernier message: 23/12/2006, 13h10
  2. erreur sur un code source basique
    Par helix_tp dans le forum Langage
    Réponses: 4
    Dernier message: 23/01/2006, 21h55
  3. Réponses: 13
    Dernier message: 13/03/2005, 20h56
  4. help sur le code d'une procedures stockee
    Par omlip dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 25/08/2004, 18h45

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