web-dev-qa-db-fra.com

Comprendre Java IOException

J'ai besoin d'aide pour comprendre l'IOException. J'ai passé en revue de nombreuses informations sur Internet et examiné les spécifications techniques sur le site Web d'Oracle Java.

Ai-je raison, dans ma compréhension de la classe IOException et de toutes ses sous-classes, qu'il n'y a pas de valeurs de "message d'erreur" ou de "code retour" associées?

Donc, si l'on voulait émettre un message et/ou renvoyer une valeur de code, il faudrait les insérer avec la logique de capture IOException?

Si ce qui précède est vrai, comment séparer les différentes sous-classes IOException?

par exemple. Si l'application a détecté une exception IOException, de quelle sorte d'exception IOException s'agit-il? Fin de fichier, fichier fermé, fichier non trouvé, fichier en cours d'utilisation, etc.

16
Guy Rich

Il n'y a pas de valeurs de "code retour" dans les exceptions (en général), mais elles contiennent des messages d'erreur. Et vous devez les gérer dans des blocs catch, où vous pouvez spécifier le type d'exception que vous souhaitez gérer. Vous pouvez avoir plusieurs blocs catch après un bloc try, pour gérer différemment différents types d'exceptions. Les blocs catch seront invoqués dans l'ordre spécifié, et le premier avec un type de paramètre approprié gérera l'exception. Vous devez donc d'abord attraper les types d'exceptions les plus spécifiques, puis les plus généraux.

Exemple simpliste:

try {
  ...
  throw new FileNotFoundException("This is an error message");
  ...
} catch (FileNotFoundException e) {
  System.out.println("File not found: " + e.getMessage());
  ...
} catch (EOFException e) {
  System.out.println("End of file reached: " + e.getMessage());
  ...
} catch (IOException e) { // catch all IOExceptions not handled by previous catch blocks
  System.out.println("General I/O exception: " + e.getMessage());
  e.printStackTrace();
  ...
} 

Comme vous le voyez dans le dernier bloc catch, les exceptions stockent la trace de pile de leur origine, qui peut être imprimée. Cependant, ce n'est généralement pas une bonne idée d'imprimer de tels messages directement comme ici; dans le code de production réel, vous souhaitez généralement enregistrer ces messages à l'aide d'un cadre de journalisation ou les afficher (parties appropriées) sur une interface utilisateur.

21
Péter Török

Il n'y a pas de codes d'erreur, mais très souvent il y a des messages. Par exemple, ils peuvent contenir le nom du fichier ou d'autres détails qui vous aident à identifier ce qui n'a pas fonctionné.

Voir les sous-classes de IOException pour plus d'idées sur les exceptions que vous pouvez obtenir.

Pour les gérer, vous pouvez utiliser différentes phrases catch. N'oubliez pas de passer d'exceptions plus spécifiques à des exceptions moins spécifiques (si vous attrapez IOException dans le premier bloc, les blocs plus spécifiques tels que FileNotFoundException ne fonctionnera jamais). Parfois, vous voudrez peut-être tous les attraper avec une seule catch (IOException) - si vous n'avez pas besoin de gérer les sous-classes d'une manière différente.

try {
    // ...
} catch (FileNotFoundException e) {
    // ...
} catch (IOException e) {
    // ...
}
4
Konrad Garus

Vous devez penser aux exceptions que vous souhaitez gérer d'une manière spécifique (pas avec un bloc catch all). Après avoir trouvé vos candidats, vous devez les attraper en fonction de leur arbre d'héritage, le plus spécifique d'abord puis le plus général (des sous-classes aux super-classes). Sachez que si votre liste noire contient trop d'exceptions qui doivent être interceptées et qu'elles appartiennent à un seul essai, vous devriez envisager de diviser ce bloc d'essai en morceaux plus petits.

2
Radu Stoenescu

Vous pouvez déterminer quelle classe est une exception ou n'importe quel objet en utilisant instanceof. Cependant, pour les exceptions, vous utiliseriez un bloc catch.

} catch(FileNotFoundException e) {
  // file not found handling

} catch(EOFException e) {
  // handle reaching the End-Of_File.

} catch(IOException e) {
  // generic IOException handling for any other IOException.

}
1
Peter Lawrey

Afin de traiter les sous-classes IOException différemment, vous devrez les attraper individuellement, comme ceci:

try {
  // some code that may throw an exception
}
catch (EOFException e) {
  // handle an end-of-file exception here)
}
...
catch (IOException e) {
  // handle an IOException that's not covered in previous catch statements
}
catch (Exception e) {
  // handle any other kind of exception
}
1
Anthony Grist