Comment boucler un try catch déclaration?
Comment avez-vous lecture en boucle d'une instruction try/catch? Je suis en train de faire un programme qui lit dans un fichier à l'aide d'un Scanner et c'est la lecture à partir du clavier. Donc ce que je veux c'est que si le fichier n'existe pas, le programme va dire "Ce fichier n'existe pas, veuillez essayer à nouveau." ensuite, demandez à l'utilisateur de taper un nom de fichier différent. J'ai essayé un couple de différentes façons pour essayer de le faire, mais toutes mes tentatives jusqu'à la fin avec le programme s'écraser.
Voici ce que j'ai
try {
System.out.println("Please enter the name of the file: ");
Scanner in = new Scanner(System.in);
File file = new File(in.next());
Scanner scan = new Scanner(file);
} catch (Exception e) {
e.printStackTrace();
System.out.println("File does not exist please try again. ");
}
Eh bien, vous avez besoin d'utiliser effectivement un
for
ou while
(ou autres) en avant de pédants 😉 afin de boucle.OriginalL'auteur Structures | 2012-09-02
Vous devez vous connecter pour publier un commentaire.
Si vous voulez réessayer après un échec, vous devez placer ce code dans une boucle; par exemple, quelque chose comme ceci:
(Un do-while est un peu plus élégant.)
Cependant, il est une MAUVAISE PRATIQUE pour attraper
Exception
dans ce contexte. Il va attraper non seulement les exceptions que vous êtes l'espoir d'arriver (par exempleIOException
), mais aussi inattendue, commeNullPointerException
et ainsi de suite qui sont les symptômes d'un bug dans votre programme.La meilleure pratique est d'attraper les exceptions que vous attendez (et peut gérer), et permettre à d'autres de se propager. Dans votre cas particulier, la capture de
FileNotFoundException
est suffisant. (Qu'est ce que leScanner(File)
constructeur déclare.) Si vous n'étiez pas à l'aide d'unScanner
pour votre entrée, vous pourriez avoir besoin pour attraperIOException
à la place.Je dois corriger une erreur grave dans le haut-voté réponse.
Cela est inexact, car les tests de dépistage que le fichier existe, n'est pas suffisant:
exists()
test de la réussite et de la tentative ultérieure pour l'ouvrir.Noter que:
File.exists()
SEULS les tests qu'un objet de système de fichiers avec le chemin d'accès spécifié, non pas que c'est en réalité un fichier, ou que l'utilisateur a accès en lecture /écriture.La bonne approche est de simplement essayer d'ouvrir le fichier, et attraper et manipuler l'
IOException
si cela arrive. Il est plus simple et plus robuste, et probablement plus rapide. Et pour ceux qui disent que les exceptions ne devraient pas être utilisés pour les "normale de contrôle de flux", ce n'est pas normal de contrôle de flux de ...Serait l'électeur soin d'expliquer sa logique ...
OriginalL'auteur Stephen C
Au lieu d'utiliser un bloc try catch, essayez un
do while
boucle de vérifier si le fichier existe.Cette méthode est en
java.io.File
+1 pour la plus expressive et élégante réponse.
+1 pour l'utilisation de
file.exists()
. Juste pour ajouter, il serait bon de mettre le deuxièmeScanner
déclaration en dehors de cette boucle.Merci pour tous les commentaires positifs, n'hésitez pas à suggérer des modifications, de sorte que l'utilisateur peut utiliser cette correctement.
-1 - pour l'utilisation de
file.exists()
. Vous avez testé uniquement pour une de nombreuses raisons alors que le fichier fourni peut ne pas ouvrir. En outre, vous ne pouvez pas tester toutes les possibilités, donc c'est une mauvaise idée de même essayer. Ce n'est vraiment pas la bonne approche. La bonne approche est de essayez d'ouvrir le fichier et attraper l'exception.OriginalL'auteur squiguy
Vous pouvez simplement envelopper dans une boucle:
Cependant, la capture de chaque exception et juste en supposant que cela est dû au fichier non existant n'est probablement pas la meilleure façon d'aller à ce sujet.
OriginalL'auteur James Montagne
Vérifier si le fichier existe, à l'aide de l'API.
OriginalL'auteur Stalzer
Essayer quelque chose comme cela:
OriginalL'auteur andand