Partage
  • Partager sur Facebook
  • Partager sur Twitter

java java.lang.classnotfoundexception Erreur

problème de reflexivité avec getConstructor

Sujet résolu
3 juin 2016 à 11:00:46

 Bonjour à tous !

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 :

	public String getClasseSouhaitee(){		
return (String) listTypesPossibles.getSelectedValue(); } public Object recuperationClasseNouvelObjet() throws InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException{ Class<?> c1 = Class.forName(getClasseSouhaitee()); System.out.println(c1); Object o2 = c1.newInstance(); System.out.println(o2); return o2; }


Or, apparaît l'erreur suivante :

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 !

Pourriez vous m'aider s'il vous plait ?

Merci beaucoup ! :)

  • Partager sur Facebook
  • Partager sur Twitter
TiBulle
Anonyme
4 juin 2016 à 1:17:13

Bonjour,

A mon avis, ta méthode getClasseSouhaitee() doit renvoyer nullce qui empêche de charger et d'instancier un objet de la classe.

Vois si ton cast s'est passé comme il faut.

-
Edité par Anonyme 4 juin 2016 à 1:17:59

  • Partager sur Facebook
  • Partager sur Twitter
6 juin 2016 à 9:14:04

Il semble qu'en fait elle me renvoie un String.

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 ?

  • Partager sur Facebook
  • Partager sur Twitter
TiBulle
6 juin 2016 à 9:48:22

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.

  • Partager sur Facebook
  • Partager sur Twitter
Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
6 juin 2016 à 11:26:12

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 ! :)

  • Partager sur Facebook
  • Partager sur Twitter
TiBulle
Anonyme
6 juin 2016 à 17:44:13

Au passage: Il ne faut jamais cacher une erreur.

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.

  • Partager sur Facebook
  • Partager sur Twitter
6 juin 2016 à 17:48:05

Songbird239 a écrit:

Au passage: Il ne faut jamais cacher une erreur.

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

  • Partager sur Facebook
  • Partager sur Twitter
Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
Anonyme
6 juin 2016 à 17:54:02

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 ! :D

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.

  • Partager sur Facebook
  • Partager sur Twitter
7 juin 2016 à 9:08:01

Songbird239 a écrit:

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 ! :D

C'est plutôt du courage qu'il faut :o

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.
  • Partager sur Facebook
  • Partager sur Twitter
Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
14 décembre 2023 à 11:07:13 - Message modéré pour le motif suivant : Merci de créer votre propre sujet


14 décembre 2023 à 11:19:40

@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. 

Déterrage

Citation des règles générales du forum :

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

Je ferme ici.

  • Partager sur Facebook
  • Partager sur Twitter