Page 1 sur 1
tp_rules question 2 java.lang.NullPointerException sans échec
Publié : 05 janv. 2021 13:47
par georg_s4
Re-bonjour,
Le test JNEWS de mon code pour la question 2 du tp "rules" passe sans échec mais indique qu'une erreur (exception pour junit) a été rencontrée sur le test 'testAvecIntrospection' (java.lang.NullPointerException), et que je dois envoyer le source incriminé.
Comment dois-je procéder pour envoyer le code ?
Avec mes remerciements
Re: tp_rules question 2 java.lang.NullPointerException sans échec
Publié : 05 janv. 2021 14:32
par douinj
bonjour, via wetransfer à mon adresse mail
vérifiez à nouveau votre utilisation de l'introspection, notamment le type constaté ...
bonne fin de tp
Re: tp_rules question 2 java.lang.NullPointerException sans échec
Publié : 06 janv. 2021 23:44
par moro_al
Même erreur de mon coté, après quelques 'tentatives' pour éliminer la remarque je n'ai pas pu trouver ce qui causait cela.
Re: tp_rules question 2 java.lang.NullPointerException sans échec
Publié : 07 janv. 2021 9:18
par douinj
Bonjour, je viens d'essayer avec la solution dite référente, ces quelques lignes peuvent peut-être vous aider
La recherche :
....
Class<?> classCommand = Class.forName(command);
//Class<?> classCommand = Class.forName(command, true, Thread.currentThread().getContextClassLoader());
instanceCommand = (CommandI<E,R>) classCommand.newInstance();
....
L'exécution,
....
instanceCommand.getClass().getDeclaredMethod("execute", entity.getClass(), result.getClass());
....
Bonne fin de tp
Re: tp_rules question 2 java.lang.NullPointerException sans échec
Publié : 07 janv. 2021 11:16
par valen_f3
Bonjour M Douin
J'ai relancé un test sur cette question par curiosité et je tombe désormais sur une erreur.
j'ai eu la chance de pouvoir accéder à la source du test et je ne comprend pas comment le test peut réussir
En effet, le test va chercher une classe Z_TestsCommands qui n'existe pas, (logiquement une ClassNotFoundException est donc levée)
mais malgré tout demande une assertion avec un bon résultat
Code : Tout sélectionner
moins4.add(dec).add(dec).add(dec).add(dec).add(print.getCommand());
int res = moins4.execute("",10);
assertEquals(6, res);
à moins que quelque chose m'échappe.
Merci d'avance,
Bonne journée
Re: tp_rules question 2 java.lang.NullPointerException sans échec
Publié : 07 janv. 2021 11:20
par douinj
re
et je ne comprend pas comment le test peut réussir
En effet, le test va chercher une classe Z_TestsCommands qui n'existe pas, (logiquement une ClassNotFoundException est donc levée)
Cette classe est locale à la classe de tests côté JNEWS, tout va bien de ce côté, vérifiez plutôt du côté NullPointerException
Bonne fin de tp
Re: tp_rules question 2 java.lang.NullPointerException sans échec
Publié : 07 janv. 2021 12:32
par lavig_p2
Bonjour M Douin,
Rencontrant cette même erreur je m'interroge également.
L' "Exception inattendue ??? null" ne peut provenir que du test tel que le source le précise : "fail("Exception inattendue ??? " + e.getMessage());"
Pour avoir un null, on imagine très bien que "question2.Z_TestsCommands$Dec" n'existe pas.
Sur ce test, le assertEquals sera donc toujours en échec..
N'y a t-il pas un bout de code que nous ne voyons pas sur cet extrait avec un assert dans le catch sur le type d'erreur par ex ?
Sinon, je ne vois pas comment ce test peut passer, aussi pourriez-vous nous orienter encore une fois ? :-)
Merci pour votre aide,
Bonne journée
Pierre
public void testAvecIntrospection() throws Exception{
try{
ReflectCommand dec = new ReflectCommand();
dec.setCommand("question2.Z_TestsCommands$Dec");
ReflectCommand print = new ReflectCommand();
print.setCommand("question2.Z_TestsCommands$Print");
//print.execute("",10);
MacroCommand<String,Integer> moins4 = new MacroCommand<>();
moins4.add(dec).add(dec).add(dec).add(dec).add(print.getCommand());
int res = moins4.execute("",10);
assertEquals(6, res);
}catch(Exception e){
fail("Exception inattendue ??? " + e.getMessage());
ASSERT ??
Re: tp_rules question 2 java.lang.NullPointerException sans échec
Publié : 07 janv. 2021 12:44
par douinj
re,
Pour avoir une sortie plus explicite j'ai ajouté la capture de l'exception
public void setCommand(String command)
{
try
{
instanceCommand = (CommandI<E,R>) Class.forName(command).newInstance();
// peut être cet appel manque...
super.setCommand(instanceCommand );
}
catch(Exception e)
{
e.printStackTrace();
}
}
Re: tp_rules question 2 java.lang.NullPointerException sans échec
Publié : 07 janv. 2021 13:18
par douinj
De nouveaux tests qui pourraient vous aider, je les intègre à la nouvelle version sur JNEWS
Code : Tout sélectionner
public void testAvecIntrospectionDeSkip() throws Exception{
try{
ReflectCommand<Object,Object> skip = new ReflectCommand();
skip.setCommand("question2.SkipCommand");
skip.execute(new Object(), new Object());
}catch(Exception e){
fail("Exception inattendue ??? " + e.getMessage());
}
}
public static class SkipBis extends SkipCommand<String,Integer>{
@Override
public Integer execute(String s, Integer i) throws Exception{
return super.execute(s,i);
}
}
public void testAvecIntrospectionDeSkipBis() throws Exception{
try{
ReflectCommand<String,Integer> skip = new ReflectCommand();
skip.setCommand("question2.TestsCommands$SkipBis");
int res = skip.execute("", 10);
assertEquals(10, res);
}catch(Exception e){
fail("Exception inattendue ??? " + e.getMessage());
}
}
public void testAvecIntrospection() throws Exception{
try{
ReflectCommand dec = new ReflectCommand();
dec.setCommand("question2.TestsCommands$Dec");
ReflectCommand print = new ReflectCommand();
print.setCommand("question2.TestsCommands$Print");
//print.execute("",10);
MacroCommand<String,Integer> moins4 = new MacroCommand<>();
moins4.add(dec).add(dec).add(dec).add(dec).add(print);
int res = moins4.execute("",10);
assertEquals(6, res);
}catch(Exception e){
fail("Exception inattendue ??? " + e.getMessage());
}
}
Re: tp_rules question 2 java.lang.NullPointerException sans échec
Publié : 07 janv. 2021 20:29
par georg_s4
Bonsoir,
Effectivement, en ajoutant la ligne
l'erreur n'existe plus.
J'ai deux interrogations complémentaires :
1/ Pourquoi avoir ajouté un attribut 'instanceCommand' et ne pas avoir utilisé l'attribut 'command' présent par héritage de la classe 'Command' et ne pas avoir directement écrit
Code : Tout sélectionner
try
{
this.command = (CommandI<E,R>) Class.forName(command).newInstance();
}
catch(Exception e)
{
e.printStackTrace();
}
?
2/ La classe privée 'SkipBis' que vous donnez dans votre message ne se compile pas, notamment car elle ne redéfinit pas la méthode 'execute' de la super-classe, probablement en raison du type des arguments.
Cette version se compile et permet de dérouler les tests sans erreur :
Code : Tout sélectionner
public static class SkipBis extends SkipCommand
{
public Integer execute(String s, Integer i) throws Exception{
return (Integer) super.execute((Object) s, (Object) i);
}
}
Mais je ne suis pas sûr qu'elle ait du sens, parce que la méthode 'execute' n'est troujours pas redéfinie...