D'après la documentation si un {{X0} } après un try-with-resources couvre la partie d'initialisation ou non.

En d'autres termes, étant donné ce fragment de code:

    try (InputStream in = getSomeStream()) {
        System.out.println(in.read());
    } catch (IOException e) {
        System.err.println("IOException: " + e.getMessage());
    }

Mon catch serait-il appelé si un IOException est jeté à l'intérieur getSomeStream()?

Ou le catch ne couvre-t-il que le bloc entre accolades, c'est-à-dire System.out.println(in.read())?

4
rustyx 20 avril 2017 à 17:35

3 réponses

Meilleure réponse

Depuis le JLS , votre exemple est un essai étendu avec des ressources.

Une instruction try-with-resources avec au moins une clause catch et / ou une clause finally est appelée une instruction try-with-resources étendue.

Dans ce cas :

L'effet de la traduction est de mettre la spécification de la ressource "à l'intérieur" de l'instruction try. Cela permet une clause catch d'une extension instruction try-with-resources pour intercepter une exception due à initialisation automatique ou fermeture de toute ressource.

Alors oui, l'exception sera interceptée par votre bloc catch.

5
Arnaud 20 avril 2017 à 15:08

Les didacticiels Oracle font autorité mais ne sont pas normatifs. Le JLS http: // docs. oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.20.3.2 répond complètement à votre question: Oui.

Lisez le manuel Fine.

0
Lew Bloch 20 avril 2017 à 14:50

Oui, c'est couvert. Fonctionnement

try (InputStream in = getSomeStream()) {
  System.out.println(in.read());
} catch (IOException e) {
  System.err.println("IOException: " + e.getMessage());
}

Avec

static InputStream getSomeStream() throws IOException {
  throw new IOException();
}

Impressions

IOException: null

Donc oui, l'exception lancée dans la partie d'initialisation est interceptée dans le bloc catch.

1
f1sh 20 avril 2017 à 14:48