peut-être il y a un spécialiste pour les internes java. J'ai un problème à comprendre le code compilé pour le code Java suivant
public class TestException
{
public static void main(String[] args)
{
StringBuilder sb = null;
try
{
sb = new StringBuilder(null);
}
catch (NullPointerException t)
{
}
if (sb != null)
{
System.out.print(sb.toString());
}
}
}
Ce sera compilé à:
stack=3, locals=3, args_size=1
0: aconst_null
1: astore_1
2: new #2 // class java/lang/StringBuilder
5: dup
6: aconst_null
7: invokespecial #3 // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
10: astore_1
11: goto 15
14: astore_2
15: aload_1
16: ifnull 29
19: getstatic #5 // Field java/lang/System.out:Ljava/io/OutStream;
22: aload_1
23: invokevirtual #6 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
26: invokevirtual #7 // Method java/io/OutStream.print:(Ljava/lang/String;)V
29: return
Exception table:
from to target type
2 11 14 Class java/lang/NullPointerException
Mon problème: à la ligne 7, le contenu de la pile est
- référence à l'occurrence de StringBuilder
- référence à l'occurrence de StringBuilder
- nul
Après avoir appelé StringBuilder (String), les deux derniers arguments seront supprimés, ainsi la pile ne contient que
- référence à l'occurrence de StringBuilder
Ceci est correct pour une exécution normale, mais lorsqu’il a une exception (adresse 14), la pile ressemblera à
- référence à l'occurrence de StringBuilder
- référence à l'instance d'exception
Après avoir stocké la référence d’exception dans la variable locale 2, il reste donc la référence du constructeur de chaînes à la fin de la capture, sur la pile.
Est-ce que quelqu'un peut indiquer où je vais mal?
Merci, Gunter
Réponses:
0 pour la réponse № 1Ce comportement est attendu. Vous avez appelé new StringBuilder(null)
, alors il y a une instance d'un StringBuilder
, même si une exception a été levée.
Bien sûr, cet objet ne sera jamais (et ne peut pas) être manipulé, car il n'a pas de référence: sb
est null
. Le garbage collector va collecter cet objet inutilisé à tout moment, mais la machine virtuelle Java en a le contrôle et vous ne pouvez pas prédire son comportement.
0 pour la réponse № 2
Dans les deux cas, vous devriez avoir le StringBuilderclasse en haut de la pile (pas une instance, mais seulement la classe). Assurez-vous de le supprimer dans votre logique de "retour" et non ailleurs.
Pouvez-vous poster du code?