Duplicaté possible: strong>
Comment gérer un initialisateur de champ final statique qui jette une exception vérifiée p>Dans cet exemple, je reçois l'erreur le champ final vide MyClass peut pas strud> a été initialisé em>: p>
xxx pré> Dans cet exemple, je reçois l'erreur le champ final MyClass peut déjà strud> a été attribué em>: p>
xxx pré> là toute solution à ce problème? P> blockQquote>
3 Réponses :
Voici une solution:
private final static MyClass myClass = buildInstance(); private static MyClass buildInstance() { try { MyClass myClass = new MyClass(); myClass.init(); return myClass; } catch (Exception e) { return null; } }
Cela convient parfaitement à mes besoins, merci beaucoup!
Si votre classe est finale, il ne peut pas modifier les valeurs une fois qu'elle est initialisée.
Ce que vous faites dans le deuxième extrait est que vous l'attribuez d'abord à Ceci n'est pas autorisé. Si Avertissement cependant, que si Nouveau MyClass () CODE>, puis si une exception est lancée dans
init () code> Vous le modifiez ensuite.
null code>. p>
nouveau myClass () code> ne jette pas une exception pourquoi ne le mettez-vous pas à la ligne supérieure? P>
init () code> jette une exception, vous aurez toujours une instance inintitulée de
myClass code>. Il ne semble pas que la façon dont vous travaillez avec cette classe correspond à la manière dont elle conçue pour fonctionner. P>
private final static MyClass myClass; static { MyClass my; try { my = new MyClass(); my.init(); } catch (Exception e) { my = null; // log } myClass = my; //only one assignment! }
Solution intéressante, merci beaucoup!
Votre
myClass code> constructeur peut-il lancer une exception? Ou est-ce
init () code> méthode qui peut lancer une exception?
Je pense que c'est la méthode d'initialisation qui peut lancer, non? Parce que dans ce cas, MyClass peut avoir une valeur assignée dans le bloc de capture.
Dit que le constructeur peut également lancer une exception. En fait, c'est un exemple qui illustre la question que j'ai rencontrée avec un autre morceau de code.