/ / Erreur dans le compilateur java lors d'une exception dans le constructeur - java, exception, compilateur-construction, constructeur

Erreur dans le compilateur java lors d'une exception dans le constructeur - java, exception, compilateur-construction, constructeur

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

  1. référence à l'occurrence de StringBuilder
  2. référence à l'occurrence de StringBuilder
  3. nul

Après avoir appelé StringBuilder (String), les deux derniers arguments seront supprimés, ainsi la pile ne contient que

  1. 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 à

  1. référence à l'occurrence de StringBuilder
  2. 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 № 1

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