Je programme actuellement une IHM en java. Elle doit permettre de manipuler différents objets : Des Instances Objets, qui font partie de Classes. Ces objets sont liés entre eux par des Règles ( de la classe que j'ai appelée Regles).
Je souhaite pouvoir créer un Objet d'une classe via l'IHM : on met le nom de l'Objet dans un TextField et on choisi sa classe parmi celles qui existent déjà, via une comboBox.
Pour récupérer les données entrées par l'utilisateur, j'utilise le bout de code suivant :
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:195)
at IHM.NouvelObjet.recuperationClasseNouvelObjet(NouvelObjet.java:225)
at IHM.NouvelObjet.boutonConfirmationCreationNouvelObjetActionPerformed(NouvelObjet.java:172)
at IHM.NouvelObjet.access$0(NouvelObjet.java:163)
at IHM.NouvelObjet$1.actionPerformed(NouvelObjet.java:143)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6516)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3312)
at java.awt.Component.processEvent(Component.java:6281)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4872)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4698)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2719)
at java.awt.Component.dispatchEvent(Component.java:4698)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:747)
at java.awt.EventQueue.access$300(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:706)
at java.awt.EventQueue$3.run(EventQueue.java:704)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:720)
at java.awt.EventQueue$4.run(EventQueue.java:718)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:717)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
Après recherches sur google, j'ai bien compris que cette erreur signifiait que des dépendances n'étaient pas correctement paramétrées ( c'est bien ça ??), qu'il y avait un souci avec mes imports.
Mais je tourne en rond, je ne parviens pas à résoudre cette erreur. Je ne sais plus où chercher la solution !
J'ai résolu java java.lang.classnotfoundexception en enlevant le throws et en ajoutant un bloc try/catch comme ci dessous :
String yo = getClasseSouhaitee().toString(); try {
Object yo2 = Class.forName(yo).newInstance();
System.out.println("hashcode du nouvel objet : " + yo2.hashCode()+"\n et sa classe : " +yo2.getClass());
}
catch (InstantiationException e)
{
System.out.println(" La classe est abstract ou est une interface ou n'a pas de constructeur accessible sans paramètre");
}
catch (ClassNotFoundException e){
System.out.println(" La classe n'existe pas");
}
catch (IllegalAccessException e)
{
System.out.println(" La classe n'est pas accessible");
}
Il n'y a alors plus d'erreur rouges, mais le système ne fonctionne toujours pas : systématiquement, il me dit que "la classe n'existe pas -bloc try/catch
(ClassNotFoundException)
)
pourtant, le string de la classe voulue est bien reconnu..
Je ne comprends pas pourquoi le try n'est jamais exécuté, sauriez vous me l'expliquer ?
Et sauriez-vous pourquoi le throws ne fonctionnait pas alors que le bloc try catch oui ?
Faire un try/catch quand ça plante c'est bien : ça ne plus plus, mais par contre ça ne fonctionne toujours pas et en plus de ça tu ne vois plus quand ça plante ! Un try/catch nécessite une gestion des erreurs, sinon ça ne sert à rien.
ClassNotFoundException vient du fait que la JVM essaye de charger une classe qu'il ne connait pas. Généralement cela vient du fait qu'il manque une dépendance dans le classpath. Techniquement c'est la méthode Class.forName qui lève l'Exception car il ne connait pas la classe. Ici c'est justement l'origine du problème : la classe saisie par l'utilisateur n'est pas bonne.
Normalement il te dit dans la stack-trace quel est le nom de la classe qu'il ne trouve pas. Si tu ne lis pas la stack-trace entièrement, ou si tu la caches avec un try/catch, ou ne l'affiche pas dans le catch, alors tu n'auras pas la solution.
Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
Très bien, j'ai comrpis maintenant du coup, ce n'est pas le try qui fonctionnait et le throw non, mais simplement le try me cachait les erreurs !
Je les ai donc affichées en ajoutant e.printStackTrace(); dans mon try/catch, et j'ai ainsi trouvé l'erreur grâce à leur affichage.
Ensuite, effectivement la classe n'était pas reconnue car je travaillais dans une classe qui n'était pas dans le même package que la classe que j'appelais.
Ca fonctionne donc maintenant, merci pour votre aide !
Quitte à faire un truc sale comme printStackTrace() c'est pas grave, mais il ne faut jamais cacher une erreur. (sinon tu te retrouves à chercher des trucs pendant 10 minutes alors que tu aurais pu t'épargner ça en affichant la trace de la pile)
Enfin quand je dis sale, je veux juste dire que cette méthode affiche toute la trace de la pile, donc c'est pas très opti, ce n'est pas bien grave.
Quitte à faire un truc sale comme printStackTrace() c'est pas grave, mais il ne faut jamais cacher une erreur. (sinon tu te retrouves à chercher des trucs pendant 10 minutes alors que tu aurais pu t'épargner ça en affichant la trace de la pile)
Enfin quand je dis sale, je veux juste dire que cette méthode affiche toute la trace de la pile, donc c'est pas très opti, ce n'est pas bien grave.
C'est ce qui est fait partout sur le projet où je suis : try/catch sans log, ainsi que des if (var==null) return valeurParDefaut;
throw new RuntimeException(e); ça peut aider pour les Exceptions non-Runtime
Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
C'est ce qui est fait partout sur le projet où je suis : try/catch sans log, ainsi que des if (var==null) return valeurParDefaut;
Bonne chance alors !
C'est plutôt du courage qu'il faut
Songbird239 a écrit:
throw new RuntimeException(e); ça peut aider pour les Exceptions non-Runtime
Oui enfin si les erreurs sont bien propagées, il ne devrait pas y avoir à faire ça.
Certes on peut déclarer la méthode comme throws TheException sauf que ça devient extrêmement lourd, surtout si ça doit traverser toutes les couches de l'application.
Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
@FatimaDiagne4 Bonjour, merci de ne pas squatter le sujet résolu des autres membres, créer votre propre sujet en nous indiquant le code que vous avez écrit.
Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.
Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre. En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.
Au lieu de déterrer un sujet il est préférable :
soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
soit de créer un nouveau sujet décrivant votre propre contexte
ne pas répondre à un déterrage et le signaler à la modération