FileNotFoundException en Java

1. Introduction

Dans cet article, nous allons parler d'une exception très courante en Java - l' exception FileNotFoundException .

Nous couvrirons les cas où cela peut se produire, les manières possibles de le traiter et quelques exemples.

2. Quand l'exception est-elle levée?

Comme indiqué dans la documentation de l'API Java, cette exception peut être levée lorsque:

  • Un fichier avec le chemin d' accès spécifié ne pas exister
  • Un fichier avec le chemin spécifié ne exist mais est inaccessible pour une raison quelconque (écriture demandé un fichier en lecture seule, ou les autorisations ne permettent pas d' accéder au fichier)

3. Comment le gérer?

Tout d'abord, en tenant compte du fait qu'il étend java.io.IOException qui étend java.lang.Exception , vous devrez le traiter avec un bloc try-catch comme avec toute autre exception E xception vérifiée .

Ensuite, ce qu'il faut faire (lié à l'activité / à la logique) dans le bloc try-catch dépend en fait de ce que vous devez faire.

Vous devrez peut-être:

  • Lever une exception spécifique à l'entreprise: cela peut être une erreur d'arrêt d'exécution, mais vous laisserez la décision dans les couches supérieures de l'application (n'oubliez pas d'inclure l'exception d'origine)
  • Alerter un utilisateur avec un dialogue ou un message d'erreur: ce n'est pas une erreur d'arrêt d'exécution, il suffit donc de notifier
  • Créer un fichier: lire un fichier de configuration optionnel, ne pas le trouver et en créer un nouveau avec les valeurs par défaut
  • Créez un fichier dans un autre chemin: vous devez écrire quelque chose et si le premier chemin n'est pas disponible, vous essayez avec un chemin de sécurité
  • Enregistrez simplement une erreur: cette erreur ne doit pas arrêter l'exécution mais vous la consignez pour une analyse ultérieure

4. Exemples

Nous allons maintenant voir quelques exemples, qui seront tous basés sur la classe de test suivante:

public class FileNotFoundExceptionTest { private static final Logger LOG = Logger.getLogger(FileNotFoundExceptionTest.class); private String fileName = Double.toString(Math.random()); protected void readFailingFile() throws IOException { BufferedReader rd = new BufferedReader(new FileReader(new File(fileName))); rd.readLine(); // no need to close file } class BusinessException extends RuntimeException { public BusinessException(String string, FileNotFoundException ex) { super(string, ex); } } }

4.1. Journalisation de l'exception

Si vous exécutez le code suivant, il «consignera» l'erreur dans la console:

@Test public void logError() throws IOException { try { readFailingFile(); } catch (FileNotFoundException ex) { LOG.error("Optional file " + fileName + " was not found.", ex); } }

4.2. Lever une exception spécifique à une entreprise

Ensuite, un exemple de levée d'une exception spécifique à l'entreprise afin que l'erreur puisse être gérée dans les couches supérieures:

@Test(expected = BusinessException.class) public void raiseBusinessSpecificException() throws IOException { try { readFailingFile(); } catch (FileNotFoundException ex) { throw new BusinessException( "BusinessException: necessary file was not present.", ex); } }

4.3. Créer un fichier

Enfin, nous essaierons de créer le fichier pour qu'il puisse être lu (peut-être pour un thread qui lit en permanence un fichier), mais encore une fois en attrapant l'exception et en gérant la deuxième erreur possible:

@Test public void createFile() throws IOException { try { readFailingFile(); } catch (FileNotFoundException ex) { try { new File(fileName).createNewFile(); readFailingFile(); } catch (IOException ioe) { throw new RuntimeException( "BusinessException: even creation is not possible.", ioe); } } }

5. Conclusion

Dans cette écriture rapide, nous avons vu quand une FileNotFoundException peut se produire et plusieurs options pour la gérer.

Comme toujours, les exemples complets sont terminés sur Github.