[Cocoa-Java] Erreur à l'exécution & Socket

molgow

Membre expert
Club iGen
4 Janvier 2002
5 496
613
40
Suisse
Voilà je vous expose mon problème :

J'ai une classe MonprogController (sous-classe de NSObject). Dans cette classe, j'ai une dizaine d'outlets et d'actions. Une de ces actions lance une connection réseau de ce type :

<font class="small">Code:</font><hr /><pre>
Socket s = new Socket();
s.connect(new InetSocketAddress(InetAddress.getByAddress(ip), port) , 10000);
...
s.close();
</pre><hr />

Jusque là pas de problème. Ca compile correctement. Et le code devrait fonctionner, je l'ai testé dans un fichier java tout simple compilé avec javac.

Là où ça se corse, c'est qu'à l'exécution (!!), il me déclare ces erreurs-là :

<font class="small">Code:</font><hr /><pre>
2003-05-25 18:23:08.744 MonProg[2292] Unknown class `MonProgController' in nib file, using `NSObject' instead.
2003-05-25 18:23:08.766 MonProg[2292] Could not connect the action monAction: to target of class NSObject
</pre><hr />

Donc au moment de l'exécution, il ne trouve plus mon controlleur et le remplace par NSObject qui évidemment ne peut pas répondre à mes IBActions. Je n'y comprends vraiment rien.. d'autant plus que si je mets en commentaires les 3 lignes de code du Socket (voir plus haut), le programme fonctionne correctement (je peux appeler mes IBActions sans problèmes). Et je vous rappelle encore que ces 3 lignes de code dans la méthode static main() d'un simple fichier java, fonctionne elle aussi correctement !

Bref, j'ai vraiment besoin d'aide... je désespère de trouver d'ou vient le problème !
 
T'es bien sur que le fichier de ta classe (.h) est bien synchrone avec celui dans IB ? Va dans IB et sélectionnes l'onglet "Classes", trouve ensuite "monProgController" et, dans le menu Classes, fais "Read monProgController.h". Re-compile et dis nous ce qui se passe.
 
Il n'y a pas de header file. Je fais du Cocoa-Java. Tout test dans le .java. Et oui, il est conforme à IB. (je l'ai recréé une fois depuis le départ à partir de IB, pour vérifier que le problème ne venait pas de là).

Je me demande une chose, ma classe MonProgControlleur, n'a aucun constructeur alors que toutes les classes en java devrait en avoir un il me semble. J'ai donc essayé de lui rajouter un constructeur (sans paramètre, et qui ne fait qu'appeler super(). je rappelle que ma classe est une sous-classe de NSObject). Mais ça ne change rien. Est-ce que le problème pourrait tout de même venir de ce côté-là ?
 
Il semble que le problème vienne de ton .nib dans lequel il ne trouve pas la classe demandée. Ca ne vient pas du code puisque tu le dit toi meme 'ca compile'.

Comme ca je ne peux pas t'aider sauf si tu veux bien m'envoyer ton code que je regarde ou ca foire.
frown.gif


Ce problème arrive normalement quand on oubie de connecter un outlet mais je pense que c'est la première chose que tu as regarder.

Désolé de ne pouvoir aller plus loin dans la recherche de la solution
 
Ok merci tout de même pour ta réponse. Je vais essayer de regarder encore une fois dans IB s'il n'y a pas d'erreurs, mais il me semble que tout était correct. J'ai changé le type "id" au bon type pour tous les outlets et tous mes outlets sont connectés.

J'ai quand meme des doutes que le problème vienne de mon nib. Dans le sens ou si je mets en commentaires les 3 lignes de code qui concernent le Socket, mon programme compile et s'exécute tout à fait correctement (il trouve ma classe MonProgController et ne génère aucune erreur à l'exécution).
 
Je suis entièrement d'accord avec toi..... c'est bizard que ca marche quand tu retires les 3 lignes.... mais si je pense au nib, c'est que l'erreur qu'il retourne annonce qu'il ne trouve pas ton controleur et ton controleur n'est ni plus ni moins qu'un objet du nib.

Je ne pense pas que les sockets agissent sur le chargement des nib.... mais bon va savoir.....

je pense qu'on a trop peu d'info pour t'aider correctement..... ca vient plus du projet que de ses trois lignes.

petite question encore... tu n'aurais pas encapsuler ton chargement de nib dans le meme try... que l'initialisation de tes sockets... dans ce cas le nib ne se charge pas et ca pourrais venir d'une initialisation de tes sockets.... (pure spéculation.)

je vjerche a comprendre......mais comme je te dis il me manque des infos......

 
<blockquote><font class="small">Post&eacute; &agrave; l'origine par Mitch:</font><hr /> petite question encore... tu n'aurais pas encapsuler ton chargement de nib dans le meme try... que l'initialisation de tes sockets... dans ce cas le nib ne se charge pas et ca pourrais venir d'une initialisation de tes sockets.... (pure spéculation.)

[/QUOTE]

Merci beaucoup pour ton aide. Je ne suis pas sur de comprendre ce que tu veux dire à propos du try. Je n'ai qu'un seul try dans mon programme, et il se trouve dans une IBAction (il entoure l'instantiation, la déclaration et les appels aux méthode de la classe Socket). Donc il n'y a pas d'instance de Socket avant d'avoir cliqué sur le bouton qui génére cette IBAction.

Je précise encore une petite chose que j'avais peut-être oublié de dire avant. Les messages d'erreurs qui m'arrivent au moment de l'exécution, apparaissent dès le lancement. Donc le problème vient peut-être bien d'un quelconque problème d'initialisation.

Enfin, je pense que ce soir je posterais ici un lien sur mon projet PB, comme ça, si il y en a qui veulent jeter un coup d'oeil...

Et encore merci pour ton aide Mitch !
zen.gif
 
J'ai repris un projet PB (DevTools de Dec2002). J'y ai créé une simple classe avec un Outlet et une IBAction. Dedans cette action j'ai ajouté le code qui bug. Après quelques tests, je me rends compte en fait, que c'est au moment de la création d'une nouvelle instance de Socket() que le problème principal survient (Socket mySocket = new Socket()). Les lignes qui suivent ne peuvent de toute manière pas fonctionner puisque il n'arrive pas à créer une instance de new Socket().

Pour info, voici l'erreur qu'il me génère à l'exécution, au moment ou je lance l'IBAction (launch()) qui devrait créer un nouveau Socket :

<font class="small">Code:</font><hr /><pre>
2003-05-27 18:29:30.351 BugTest[923] java/lang/IllegalAccessError: try to access method java.net.Socket.&lt;init&gt;()V from class BugTestController
Stack Trace:
java.lang.IllegalAccessError: try to access method java.net.Socket.&lt;init&gt;()V from class BugTestController
at BugTestController.launch(BugTestController.java:22)
</pre><hr />

Vous pouvez téléchargez ici le projet PB complet.

La question maintenant est donc, qu'est-ce que peut bien vouloir dire ce IllegalAccessError ?
 
Il me semble aue j'ai ta solution. En fait ca ne vient ni de ton code ni de ton nib mais de la machine virtuelle Java qui n'est pas défini correctement.

Et oui InetSocketAddress c'est du java 1.4 or par défaut lors de l'execution il prends la 1.3 si on ne lui spécifie pas. or il compile bien avec la 1.4 (va comprendre)

Pour corriger tu passe sur l'onglet Targets puis sur l'elements BugTest.

Dans "Info.plist Entry" - Simple view passe sur Java Compiler setting pour positionner ta JVM sur 1.4 ou supérieur.

Et la ta classe est reconnu puisque tu charge ta machine virtuelle.

J'espère que maintenant tu pourras avancer. Et que j'ai été assez limpide dans mes explications.


wink.gif
 
Génial !!!! Maintenant ça fonctionne !

En tout cas, merci merci merci merci merci merci... ! Sans ton aide, je n'aurais jamais pu imaginer que le problème venait de là !

Je me demande juste une chose maintenant, c'est avec cette option de la JVM 1.4+. Mon programme risque de ne pas fonctionner chez des gens qui n'auraient pas fait la mise à jour java. Dans ce cas, sais-tu ce qu'il se passe ? (message d'erreur automatique leur disant qu'il faut java 1.4, ouverture impossible de l'appli sans explication, ou bien lancement de l'appli mais bugs en perspective, ...)

-----

Je viens d'essayer de mettre 1.3+ pour la JVM, et ça fonctionne aussi. C'est étonnant, dans le sens, ou comme tu le disais, j'utilise InetSocketAddress qui est une classe disponible depuis java 1.4.
 
<blockquote><font class="small">Post&eacute; &agrave; l'origine par molgow:</font><hr /> Je me demande juste une chose maintenant, c'est avec cette option de la JVM 1.4+. Mon programme risque de ne pas fonctionner chez des gens qui n'auraient pas fait la mise à jour java. Dans ce cas, sais-tu ce qu'il se passe ? (message d'erreur automatique leur disant qu'il faut java 1.4, ouverture impossible de l'appli sans explication, ou bien lancement de l'appli mais bugs en perspective, ...)


[/QUOTE]

Si tu utilise java 1.4 et que l'utilisateur n'a pas fait la mise a jour, c'est sur que ca ne fonctionnera pas. il aura a mon avis le message que tu avais. je n'ai pas testé.

Mais c'est le meme problème que quand tu fais une application cocoa et que tu essais de la lancer sous os 9. en plus la mise a jour pour java est gratuite donc je pense que la majorité des utilisateurs l'on faite.

Sinon lors de la distribution de ton appli spécifie bien qu'il faut le java 1.4