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

JavaFX Discussion :

Bloc catch ignoré


Sujet :

JavaFX

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 112
    Points : 111
    Points
    111
    Par défaut Bloc catch ignoré
    Bonjour, j'aimerais savoir pourquoi dans le code ci-dessous l'erreur n'est pas attrapée

    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
     
    try
    {
    	System.out.println("début try");
    	Stage w = new Stage();
    	w.getIcons().add(null); // NullPointerException
    	System.out.println("fin try");
    }
    catch (Exception e)
    {
    	System.out.println("erreur attrapée"); // non affiché
    }
    finally
    {
    	System.out.println("bloc finally");
    }
    "fin try" est également affiché, comme si l'erreur arrivait à retardement...

  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 : 54
    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,

    On peut avoir le vrai code complet, parce qu'en l'état, ce code ne compile pas puisqu'il n'y a aucune méthode dans aucune classe, et qu'on ne sait pas ce qu'est exactement Stage (javafx.stage.Stage ?).

    Si c'est un javafx.stage.Stage, et qu'on met ce code dans une méthode main(), une exception est soulevée lors de l'exécution de new Stage() avant l'exécution de w.getIcons().add(null);, donc l'hypothétique NullPointerException ne sera jamais soulevée, donc encore moins attrapée. Mais "fin try" n'est pas affiché.

    Sinon, dans le cas général, si "fin try" s'affiche, et qu'une stack d'exception s'affiche (sans le "erreurattrapée"), y compris pour une NullPointerException, c'est parce que l'exception est produite dans un thread lancé dans l'initialisation de Stage.
    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 régulier
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 112
    Points : 111
    Points
    111
    Par défaut
    Il suffit de placer ce code dans la méthode start() d'une sous-classe de Application, donc il s'exécute bien sur le thread JavaFX, et en commentant la ligne w.getIcons().add(null) l'erreur n'apparaît pas donc le problème provient bien de celle-ci.
    nb:Il s'agit bien de la classe javafx.stage.Stage

  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 : 54
    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
    Il ne suffit de rien du tout. Si tu veux qu'on réponde à ta question, tu fournis de quoi la reproduire ce qu'on ait besoin de faire des suppositions et surtout d'avoir à créer un snippet pour la réproduire. La stacktrace de l'exception serait utile aussi.
    Dans ton cas, l'exception ne remonte pas à ton code, parce qu'elle est attrapée et affichée avant, ici :
    com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(ListListenerHelper.java:164)

    Donc ton appel ne soulève pas la NullPointerException qui est affichée.
    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 régulier
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 112
    Points : 111
    Points
    111
    Par défaut
    Je n'ai même pas pensé à regarder dans la pile tellement ça me semblait bizarre, cette méthode appelle le handler des erreurs non attrapées du fil en cours, ce qui est plutôt étonnant comme implémentation je trouve. On fait une opération à un endroit et au lieu que l'exception soit levée localement pour qu'on puisse faire le lien avec ce qu'on est en train de faire elle est bazardée dans un autre morceau de code qui forcément gérera l'exception de manière plus générale, c'est le genre d'erreur compliquée à déterrer.
    Bref je vais devoir revoir mon code de gestion des exceptions.
    Merci pour ton aide.

  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 : 54
    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
    C'est pour éviter que le thread de JavaFx s'arrête. Les exceptions, c'est pour gérer ce qu'on ne maîtrise pas, ce qu'on ne peut prévoir. En théorie, comme tu sais que ça provoque une exception, tu ne devrais pas passer null en paramètre.
    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
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Pour ce que j'en pense c'est que tu modifies une liste observable -> donc quelques part le gestionnaire du Stage observe cette liste -> Donc il reagit a ton ajout -> c'est lui qui catch et affiche l'erreur -> donc elle ne remonte jamais dans ton code.

    C'est ce qu'indique la 1ere trace visible:

    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
    Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
    	at javafx.stage.Stage$4.onChanged(Stage.java:696) ----------------------------------------------------------------> On semble etre dans un callback ici.
    	at com.sun.javafx.collections.TrackableObservableList.lambda$new$19(TrackableObservableList.java:45)
    	at com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(ListListenerHelper.java:164) ------> Notification d'evenement ici.
    	at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73)
    	at javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:233)
    	at javafx.collections.ListChangeBuilder.commit(ListChangeBuilder.java:482)
    	at javafx.collections.ListChangeBuilder.endChange(ListChangeBuilder.java:541)
    	at javafx.collections.ObservableListBase.endChange(ObservableListBase.java:205)
    	at javafx.collections.ModifiableObservableListBase.add(ModifiableObservableListBase.java:155)
    	at java.util.AbstractList.add(AbstractList.java:108) ------------------------------------------------------------------> On ajoute l'icone null ici.
    	at stagenull.Main.start(Main.java:21) -------------------------------------------------------------------------------> L'application demarre ici.
    	at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
    	at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
    	at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
    	at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    	at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    	at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
    	at java.lang.Thread.run(Thread.java:748)
    En fait l'erreur est catchee au moment de la propagation a la ligne 164 de com.sun.javafx.collections.ListListenerHelper<E> :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     @Override
            protected void fireValueChangedEvent(ListChangeListener.Change<? extends E> change) {
                try {
                    listener.onChanged(change);
                } catch (Exception e) {
                    Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e);
                }
            }
    Apres une seconde erreur est levee si on essaie de rendre la fenetre visible.

    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
    java.lang.reflect.InvocationTargetException
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:498)
    	at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
    	at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:498)
    	at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
    Caused by: java.lang.RuntimeException: Exception in Application start method
    	at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
    	at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182)
    	at java.lang.Thread.run(Thread.java:748)
    Caused by: java.lang.NullPointerException
    	at javafx.stage.Stage.impl_visibleChanged(Stage.java:1189)
    	at javafx.stage.Window$9.invalidated(Window.java:895)
    	at javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:109)
    	at javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:144)
    	at javafx.stage.Window.setShowing(Window.java:922)
    	at javafx.stage.Window.show(Window.java:937)
    	at javafx.stage.Stage.show(Stage.java:259) ------------------------------------------------------------------------> On affiche la fenetre ici.
    	at stagenull.Main.start(Main.java:29) -------------------------------------------------------------------------------> L'application demarre ici.
    	at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
    	at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
    	at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
    	at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    	at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    	at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
    	... 1 more
    Exception running application stagenull.Main
    Il pourrait etre interressant de reporter le bug sur http://bugs.java.com/ en suggerant que les elements passes dans la liste ne doivent pas etre null (mais ca demanderait de surcharger toutes les methodes add(), addAll(), pour faire les verifs appropriees), ce qui n'est pas infaisable car dans le code de Stage on trouve :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    private ObservableList<Image> icons = new TrackableObservableList<Image>() {
             @Override protected void onChanged(Change<Image> c) {
                 List<Object> platformImages = new ArrayList<Object>();
                 for (Image icon : icons) {
                     platformImages.add(icon.impl_getPlatformImage()); ------------------------> L'exception est levee ici au fait !
                 }
                if (impl_peer != null) {
                    impl_peer.setIcons(platformImages);
                }
             }
        };
    Mais bon du coup ca casserait le contrat de l'interface List qui n'interdit pas du tout les valeurs null et donc pour le coup ils ne changeront sans doute rien. A noter cependant que Parent.getChildren().add() lance bien une exception lorsqu'on essaie d'inserter un noeud enfant null donc la solution n'est pas si exotique que cela.

    D'un autre cote une suggestion de verifier que la valeur de la liste n'est pas null aux lignes 696 et 1189 de Stage et de ne rien faire (c-a-d ne pas tenter d'acceder au peer natif) quand c'est le cas serait sans doute plus la bienvenue. Et, dans les deux blocs, remplacer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    List<Image> icons = new LinkedList();
    List<Object> platformImages = new LinkedList<>();
    for (Image icon : icons) {
        platformImages.add(icon.impl_getPlatformImage());
    }
    Par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    List<Image> icons = new LinkedList();
    List<Object> platformImages = new LinkedList<>();
    for (Image icon : icons) {
        if (icon == null)  {
             continue;
        }
        platformImages.add(icon.impl_getPlatformImage());
    }
    Ou :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    List<Object> platformImages = icons.stream()
            .filter(Objects::nonNull)
            .map(Image::impl_getPlatformImage)
            .collect(Collectors.toList());
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  8. #8
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Bon ben j'ai soumis un rapport de bug qui suggere les deux solutions
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  9. #9
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Et voila :

    Oracle : JDK-8181930 : Adding a null icon to a Stage prevents application startup
    Open JDK : [JDK-8181930] Adding a null icon to a Stage prevents application startup

    Pour une fois le transfert vers l'OpenJDK a ete rapide. Par contre pour la resolution.... faudra sans doute voir pour une maj post-JDK 9.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 112
    Points : 111
    Points
    111
    Par défaut
    Merci pour les pavés. ^^

  11. #11
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Une maj sur le problème des icônes nulle : [JDK-8181930] Adding a null icon to a Stage prevents application startup

    Un fix sera intégré au JDK10 et peut-être backporté sur le JDK9. Il sont partis sur la solution d'interdire l'insertion d'une icône null dans la liste des icônes du Stage, un peu comme quand on fait parent.getChildren().add(null)
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

Discussions similaires

  1. [doxygen] bloc \fn ignoré
    Par sybe30 dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 31/08/2015, 13h22
  2. [Débutant] forcer le passage par le bloc catch
    Par ouinih dans le forum C#
    Réponses: 5
    Dernier message: 15/07/2011, 16h38
  3. [JOptionPane] probleme dans un bloc catch
    Par Balbuzard dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 22/08/2008, 15h59
  4. Réponses: 1
    Dernier message: 15/01/2008, 12h39
  5. Bloc catch non atteint
    Par Cram_N7 dans le forum Langage
    Réponses: 5
    Dernier message: 05/04/2007, 11h23

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