Bonjour,

J'essaye d'écrire un "runtime" java qui contrôlera l'exécution d'un programme quelconque. Dans le contexte d'exécution un objet peut ne pas être défini en mémoire alors qu'il devrait l'être. J'utilise donc JDI pour attrapper les NullPointerException (définies blocantes pour la jvm cible), et je voudrais alors :
- récupérer l'identifiant de l'objet ayant déclenché l'exception (j'ai l'impression qu'il n'existe pas de moyen simple pour faire ça, à part passer par la "location" de l'exception et de parser le bytecode pour y trouver les variables)
- vérifier que cet objet "devrait" être défini et sa valeur (ça c'est le but du runtime, pas une question )
- instancier l'objet et lui donner sa valeur théorique
- relancer l'exécution

J'ai essayé avec un simple String, connu à l'avance (j'élimine ainsi la première question pour le moment), mais si en pratique ça fonctionne avec le debugger de NetBeans (on peut donner une valeur au String puis appeler une méthode dessus sans déclencher d'exception) avec mon programme ça ne marche pas.

Mon code ressemble à ça :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
// getting variables
        List<LocalVariable> vars = stack.visibleVariables();
        for (Iterator it = vars.iterator(); it.hasNext();) {
              LocalVariable elem = (LocalVariable) it.next();
              System.out.println(elem);
              System.out.println("value is "+stack.getValue(elem));
              if (elem.name().equals("s")){
                    StringReference v = vm.mirrorOf("Inserted String | ");
                    stack.setValue(elem,v);
              }
        }
        LocalVariable s = stack.visibleVariableByName("s");
        System.out.println("Value is now: "+stack.getValue(s));
La valeur de s affichée est bien la bonne ("Inserted String |"), mais le resume() de la jvm cible m'affiche quand même un NullPointerException et quitte.

Quelqu'un connait la marche à suivre ? Je suis un peu perdu là...

Merci