tp_rules question 2 java.lang.NullPointerException sans échec

Programmation Avancée

Modérateur : douinj

Répondre
georg_s4
Messages : 21
Inscription : 16 oct. 2020 11:09

tp_rules question 2 java.lang.NullPointerException sans échec

Message par georg_s4 » 05 janv. 2021 13:47

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

douinj
Messages : 263
Inscription : 18 mars 2009 15:46

Re: tp_rules question 2 java.lang.NullPointerException sans échec

Message par douinj » 05 janv. 2021 14:32

bonjour, via wetransfer à mon adresse mail

vérifiez à nouveau votre utilisation de l'introspection, notamment le type constaté ...

bonne fin de tp

moro_al
Messages : 31
Inscription : 01 oct. 2020 21:34

Re: tp_rules question 2 java.lang.NullPointerException sans échec

Message par moro_al » 06 janv. 2021 23:44

Même erreur de mon coté, après quelques 'tentatives' pour éliminer la remarque je n'ai pas pu trouver ce qui causait cela.

douinj
Messages : 263
Inscription : 18 mars 2009 15:46

Re: tp_rules question 2 java.lang.NullPointerException sans échec

Message par douinj » 07 janv. 2021 9:18

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

valen_f3
Messages : 20
Inscription : 30 sept. 2020 10:46

Re: tp_rules question 2 java.lang.NullPointerException sans échec

Message par valen_f3 » 07 janv. 2021 11:16

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)

Code : Tout sélectionner

 dec.setCommand("question2.Z_TestsCommands$Dec"); 
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

douinj
Messages : 263
Inscription : 18 mars 2009 15:46

Re: tp_rules question 2 java.lang.NullPointerException sans échec

Message par douinj » 07 janv. 2021 11:20

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

lavig_p2
Messages : 16
Inscription : 02 oct. 2020 13:53

Re: tp_rules question 2 java.lang.NullPointerException sans échec

Message par lavig_p2 » 07 janv. 2021 12:32

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 ??

douinj
Messages : 263
Inscription : 18 mars 2009 15:46

Re: tp_rules question 2 java.lang.NullPointerException sans échec

Message par douinj » 07 janv. 2021 12:44

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();
}
}

douinj
Messages : 263
Inscription : 18 mars 2009 15:46

Re: tp_rules question 2 java.lang.NullPointerException sans échec

Message par douinj » 07 janv. 2021 13:18

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());
        }

    }

georg_s4
Messages : 21
Inscription : 16 oct. 2020 11:09

Re: tp_rules question 2 java.lang.NullPointerException sans échec

Message par georg_s4 » 07 janv. 2021 20:29

Bonsoir,
Effectivement, en ajoutant la ligne

Code : Tout sélectionner

super.setCommand(instanceCommand);
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...

Répondre