Est-il une préférence pour les sous blocs try/catch?

L'une des choses qui toujours me dérange à propos de l'utilisation des Lecteurs et des Flux en Java, c'est que le close() méthode peut lever une exception. Depuis c'est une bonne idée de mettre la méthode close dans un bloc finally, qui nécessite un peu d'une situation délicate. J'ai l'habitude d'utiliser cette construction:

FileReader fr = new FileReader("SomeFile.txt");
try {
    try {
        fr.read();
    } finally {
        fr.close();
    }
} catch(Exception e) {
    //Do exception handling
}

Mais j'ai aussi vu cette construction:

FileReader fr = new FileReader("SomeFile.txt");
try {
    fr.read() 
} catch (Exception e) {
    //Do exception handling
} finally {
    try {
        fr.close();
    } catch (Exception e) {
        //Do exception handling
    }
}

Je préfère la première construction, car il n'y a qu'un seul bloc catch et il me semble plus élégant. Est-il une raison pour lui préfère la deuxième ou une autre construction?

Mise à JOUR: y Aurait-il une différence si je l'ai fait remarquer que les deux read et close que jeter IOExceptions? Il semble donc probable pour moi que, si la lecture échoue, près échouera pour la même raison.

  • Le pire, c'est effectivement que la méthode close() peut lever une exception. Si une exception se produit, alors quoi d'autre pourriez-vous faire d'autre que de fermer le stream? Et puis de la fermeture de il jette une autre exception, de sorte que vous devrait fermer le flux de données, ce qui... je n'aime pas Java pour ces bêtises.
  • Qu'advient-il si l'utilisateur travaille sur un ensemble de flux et l'on ne parvient pas à fermer? Cela pourrait signifier que tous les autres cours d'eau sont dans un état inutilisable et doit être testé. S'il est ignoré, alors qu'ils pourraient être dans un état inutilisable et l'utilisateur continue à faire le travail et ne pas être en mesure de sauver.
  • Mon point est que vous ne pouvez pas faire quelque chose, mais de le fermer lorsqu'une exception est levée, alors pourquoi jeter LORS de la fermeture? L'OMI de clôture ne doit pas échouer, parce que vous ne pouvez pas faire quoi que ce soit et vous ne pouvez pas en sortir. Le flux est mauvaise après la clôture, a échoué ou non. Dans .NET, Close() ne pas jeter.
  • Si vous utilisez un seul flux est valide. Toutefois, lorsque plusieurs flux sont en jeu, il est une excellente occasion pour déclencher un test de cohérence des autres cours d'eau afin de déterminer si l'intervention de l'utilisateur est requise.
  • Je n'ai jamais vu de code qui fait que, bien que. La plupart soit à l'arrêt lorsque l'un flux échoue (car vous ne pouvez pas continuer, même si les autres filières sont très bien), ou ils continuent et se faire une exception par rapport aux autres cours d'eau quand elles sont mauvaises.
InformationsquelleAutor eaolson | 2008-10-08