2010-03-19 3 views
7

Jetez un coup d'oeil que l'extrait de code suivant:`return value 'à partir de Constructor Exception en Java?

A a = null 
try { 
    a = new A(); 
} finally { 
    a.foo(); // What happens at this point? 
} 

On suppose que le constructeur de A lance une exception d'exécution. A la ligne marquée, suis-je toujours assuré d'obtenir une exception NullPointerException, ou foo() sera invoqué sur une instance semi-construite?

Répondre

12

Le code à l'intérieur du bloc try contient deux opérations distinctes:

  1. Créer une nouvelle instance A.
  2. Affectez la nouvelle instance à une variable nommée a.

Si une exception est générée à l'étape 1, l'étape 2 ne sera pas exécutée. Par conséquent, vous obtiendrez toujours un NullPointerException.

+1

Par conséquent, écrivez-le comme 'final A a = new A(); essayez {...} enfin {a.foo(); } '. Et si vous avez besoin d'une exception, ajoutez ** un autre ** essayez de bloquer le lot. –

+0

ou si vous n'êtes pas sûr de l'état de la référence 'a' dans le bloc finally, enveloppez juste' a.foo() 'avec' (si un! = Null) ' –

6

Si new A() déclenche une exception, vous obtiendrez toujours une exception NullPointerException car l'affectation à a n'aura pas lieu.

1

Je pense que vous obtiendrez toujours un NPE à la ligne marquée. L'affectation n'a jamais aucune chance de se produire.

1

Si l'exception s'est produite dans le constructeur, appelez new A(), cette fois, l'objet a la valeur null.So le a.foo() donne l'exception du pointeur nul.Vous pouvez donner la condition comme si (a! = null) { a.foo(); }

Questions connexes