IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Un Predicate provoque une erreur de compilation insoluble : il réclame un catch d'exception pourtant réalisé


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    608
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 608
    Par défaut Un Predicate provoque une erreur de compilation insoluble : il réclame un catch d'exception pourtant réalisé
    Bonjour,

    Je souhaite réaliser un test unitaire testant des lectures en base de données dans de nombreuses situations.

    J'ai écrit cette fonction utilitaire pour m'aider :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    private void checkAllRecordsMatchesCondition(String sql, Predicate<ResultSet> condition) throws SQLException {
    	try(Connection connection = connect(); Statement stmt = connection.createStatement(); ResultSet rs = stmt.executeQuery(sql)) {
    		while(rs.next()) assertTrue(sql, condition.test(rs));
    	}
    }
    mais quand je l'utilise, elle me pose un problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    @Test public void whereCondition_field_literal() throws SQLException {
    	checkAllRecordsMatchesCondition("SELECT * FROM SignedBikeRoute WHERE FNODE_ < 2000", rs -> rs.getInt("FNODE_") < 2000);
    }
    Le compilateur désigne la partie en rouge d'un "Unhandled exception type SQLException".
    Cette exception est dans la directive throws de ma fonction.

    Quelque-chose m'échappe ?

    Merci !

  2. #2
    Membre éprouvé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Par défaut
    Tu es certain que le problème ne vient pas plutôt de ta méthode checkAllRecordsMatchesCondition, qui contient un try sans catch ni finally ?

  3. #3
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Citation Envoyé par Satch Voir le message
    Tu es certain que le problème ne vient pas plutôt de ta méthode checkAllRecordsMatchesCondition, qui contient un try sans catch ni finally ?
    Non : c'est le try-with-ressource de Java 7, qui permet de libérer proprement les ressources.


    Citation Envoyé par grunt2000 Voir le message
    Le compilateur désigne la partie en rouge d'un "Unhandled exception type SQLException".
    Cette exception est dans la directive throws de ma fonction.

    Quelque-chose m'échappe ?
    Le problème vient du concept même des "checked-exceptions" de Java : par défaut toute exception doit être soit traité soit déclarée.
    Certe tu le fais bien au niveau de ta méthode, mais ce n'est pas fait dans la lambda !

    Le problème c'est qu'il faut que cela soit fait au niveau de la lambda... ce qui n'est pas le cas.
    Les lambdas "standards" du package java.util.function ne déclarent aucune exception, et ne peuvent donc pas les remonter.


    On le voit mieux si on écrit cela de manière classique avec une classe anonyme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	@Test public void whereCondition_field_literal() throws SQLException {
    		checkAllRecordsMatchesCondition("SELECT * FROM SignedBikeRoute WHERE FNODE_ < 2000", new Predicate<ResultSet>() {
    			@Override
    			public boolean test(ResultSet rs) {
    				 return rs.getInt("FNODE_") < 2000; // SQLException non-gérée
    			}
    		});
    	}


    Bref les checked-exceptions pose encore plus de problème avec les lambdas !



    Du coup la meilleure solution consiste à se créer sa propre interface Predicate gérant les SQLException :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @FunctionalInterface
    public interface SQLPredicate<T> {
    	boolean test(T t) throws SQLException;
    }
    Voir même en paramétrant cela via les Generics :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @FunctionalInterface
    public interface CheckedPredicate<T, E extends Throwable> {
    	boolean test(T t) throws E;
    }


    a++

  4. #4
    Membre éprouvé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Non : c'est le try-with-ressource de Java 7, qui permet de libérer proprement les ressources.
    Oops !

    Faut vraiment que je me mette un peu plus à jour

  5. #5
    Membre très actif

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    608
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 608
    Par défaut
    Merci AdiGuba !
    Je m'en vais essayer ta solution demain matin.

    EDIT : Cela fonctionne très bien, merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Provoquer une erreur de compilation
    Par yann458 dans le forum Langage
    Réponses: 4
    Dernier message: 16/09/2012, 02h42
  2. msaccess a provoqué une erreur dans KERNEL32.dll
    Par massol joel dans le forum Access
    Réponses: 12
    Dernier message: 03/04/2006, 14h32
  3. Cells (1,1) provoque une erreur
    Par Opo dans le forum Access
    Réponses: 9
    Dernier message: 07/03/2006, 16h29
  4. [SGBD] mysql_fetch_array provoque une erreur
    Par nicerico dans le forum Requêtes
    Réponses: 6
    Dernier message: 06/10/2005, 14h20
  5. Select Case provoque une erreur
    Par defluc dans le forum SQL
    Réponses: 6
    Dernier message: 14/08/2005, 23h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo