Maison >Java >javaDidacticiel >Comment les exceptions vérifiées peuvent-elles être gérées efficacement dans les Lambdas et Streams Java 8 ?
Lancement d'exceptions vérifiées à partir des Lambdas et des flux Java 8 : défis et solutions de contournement
Dans Java 8, les expressions et les flux lambda offrent un environnement élégant et fonctionnel moyen de manipuler les données. Cependant, un défi courant survient lorsque l'on tente de lancer des exceptions vérifiées à partir de ces constructions.
Le problème : lancer des exceptions vérifiées à partir de Lambdas
Le problème vient du manque de un moyen direct de lancer des exceptions vérifiées à partir d'expressions lambda. En d’autres termes, les lambdas ne peuvent pas déclarer directement d’exceptions dans leur clause throws. Prenons l'exemple suivant :
public List<Class<?>> getClasses() throws ClassNotFoundException { List<Class<?>> classes = Stream.of("java.lang.Object", "java.lang.Integer", "java.lang.String") .map(className -> Class.forName(className)) .collect(Collectors.toList()); return classes; }
Ce code ne parvient pas à se compiler en raison de l'exception vérifiée levée par la méthode Class.forName(). Le compilateur Java interdit l'utilisation d'exceptions vérifiées dans les lambdas.
Pourquoi ne pas envelopper les exceptions dans les exceptions d'exécution ?
Une solution de contournement courante consiste à envelopper les exceptions vérifiées dans les exceptions d'exécution et lancez plutôt les exceptions encapsulées. Cependant, cette approche n'est pas souhaitable car elle obscurcit le type d'exception d'origine et ajoute une complexité inutile à la base de code.
Le bug de l'API : manque de mécanisme de transfert
La cause première L'une des principales difficultés réside dans une faille dans la conception de l'API Java 8. Les interfaces fonctionnelles utilisées dans les flux ne fournissent pas de mécanisme pour transmettre les exceptions vérifiées. Par conséquent, le compilateur ne peut pas déduire le type d'exception émis par une expression lambda et le propager via le pipeline de flux.
Le bug de spécification du langage : inférence de type incomplète
Un autre facteur contributif est une faille subtile dans la spécification du langage Java. Le mécanisme d'inférence de type ne permet pas aux paramètres de type de déduire une liste de types lorsqu'ils sont utilisés dans les clauses throws. Par conséquent, le compilateur ne peut pas déduire le type d'exception spécifique généré par une expression lambda.
Solutions de contournement actuelles et défis ouverts
Bien qu'Oracle n'ait pas encore résolu ces problèmes directement , plusieurs solutions de contournement existent :
Cependant, ces solutions de contournement introduisent une surcharge et une complexité supplémentaires dans la base de code. L'absence d'un mécanisme de transfert d'exceptions approprié reste une limitation importante lorsque l'on travaille avec des exceptions vérifiées dans les expressions et flux Java 8 lambda.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!