Pourquoi Java ne permet-il pas de lancer une exception vérifiée à partir du bloc d’initialisation statique?

Pourquoi Java ne permet-il pas de lancer une exception vérifiée à partir d’un bloc d’initialisation statique? Quelle était la raison de cette décision de conception?

Parce qu’il n’est pas possible de gérer ces exceptions vérifiées dans votre source. Vous n’avez aucun contrôle sur le processus d’initialisation et les blocs statiques {} ne peuvent pas être appelés depuis votre source pour que vous puissiez les entourer de try-catch.

Comme vous ne pouvez gérer aucune erreur indiquée par une exception vérifiée, il a été décidé d’interdire le lancement des blocs statiques d’exceptions vérifiées.

Le bloc statique ne doit pas lancer d’exceptions vérifiées, mais permet toujours d’ exécuter des exceptions non vérifiées / à l’exécution. Mais selon les raisons ci-dessus, vous ne seriez pas en mesure de les gérer non plus.

En résumé, cette ressortingction empêche (ou du moins le rend plus difficile) au développeur de créer quelque chose qui peut entraîner des erreurs auxquelles l’application ne pourrait pas récupérer.

Vous pouvez contourner le problème en interceptant toute exception vérifiée et en la renvoyant en tant qu’exception non contrôlée. Cette classe d’exception non contrôlée fonctionne bien comme un wrapper: java.lang.ExceptionInInitializerError .

Exemple de code:

 protected static class _YieldCurveConfigHelperSingleton { public static YieldCurveConfigHelper _staticInstance; static { try { _staticInstance = new YieldCurveConfigHelper(); } catch (IOException | SAXException | JAXBException e) { throw new ExceptionInInitializerError(e); } } } 

Cela devrait ressembler à ceci (ce n’est pas du code Java valide)

 // Not a valid Java Code static throws SomeCheckedException { throw new SomeCheckedException(); } 

mais comment est-ce que l’annonce va là où tu l’attrapes? Les exceptions vérifiées nécessitent une capture. Imaginez des exemples qui peuvent initialiser la classe (ou peut-être pas parce qu’elle est déjà initialisée), et pour attirer l’attention sur la complexité qu’elle introduirait, je mets les exemples dans un autre initalizer statique:

 static { try { ClassA a = new ClassA(); Class clazz = Class.forName(ClassB.class); Ssortingng something = ClassC.SOME_STATIC_FIELD; } catch (Exception oops) { // anybody knows which type might occur? } } 

Et une autre chose méchante –

 interface MyInterface { final static ClassA a = new ClassA(); } 

Imaginez que ClassA ait un initialiseur statique générant une exception vérifiée: Dans ce cas, MyInterface (qui est une interface avec un initialiseur statique «caché») devrait lancer l’exception ou la gérer – gestion des exceptions dans une interface? Mieux vaut le laisser tel quel.

Jetez un coup d’œil aux spécifications du langage Java : il est indiqué qu’il s’agit d’une erreur de compilation si l’ échec de l’ initialiseur statique peut se terminer brutalement avec une exception vérifiée.

Étant donné qu’aucun code que vous écrivez ne peut appeler un bloc d’initialisation statique, il n’est pas utile de lancer des exceptions vérifiées. Si c’était possible, que ferait le jvm quand une exception vérifiée est lancée? Runtimeexceptions sont propagées.

Je suis capable de comstackr le lancement d’une exception vérifiée aussi ….

 static { try { throw new IOException(); } catch (Exception e) { // Do Something } }