2
votes

Analyseur de fichiers: exception FileNotFoundException non signalée; doit être attrapé ou déclaré être lancé

J'ai essayé tout ce que je pouvais trouver sur Internet, et rien ne semble résoudre ce problème. Je demande de l'aide, dis-moi ce que je fais de mal. Je suis tout nouveau sur Java. Merci!

Unreported exception FileNotFoundException; must be caught or declared to be thrown

Ceci affiche l'erreur suivante

import java.util.Scanner;

class File_Scanner {    
    public static void read() {
        File credentials_file = new File("credentials.txt");
        Scanner file_reader = new Scanner(credentials_file);
        String[] users = new String[6];
        int index_counter = 0;

        try {
            while (file_reader.hasNextLine()) {
                users[index_counter] = file_reader.nextLine();
            }
            file_reader.close();

        } catch (Exception e) {
          System.out.println(e.getClass());
        }
    }
}


2 commentaires

Le numéro de ligne de l'erreur du compilateur devrait vous indiquer exactement quelle ligne pourrait lever cette exception.


Renseignez-vous sur les «exceptions vérifiées». Créez un meilleur code, mais c'est parfois très douloureux.


5 Réponses :


1
votes

Java a vérifié les exceptions. Ce qui signifie que si le code de votre méthode déclare qu'il pourrait éventuellement lever une exception particulière, votre méthode doit soit effectuer l'une des opérations suivantes:

Soit (1) gère cette exception:

public static void read() throws FileNotFoundException {
    // your method code
}


0 commentaires

2
votes

Je voudrais recommander d'entourer toute la fonction read d'un bloc try / catch comme celui-ci.

import java.util.Scanner;

class File_Scanner{    
    public static void read(){
        try {
            File credentials_file = new File("credentials.txt");
            Scanner file_reader = new Scanner(credentials_file);
            String[] users = new String[6];
            int index_counter = 0;

            while (file_reader.hasNextLine()) {
                users[index_counter] = file_reader.nextLine();
            }

            file_reader.close();
        } catch (Exception e) {
          System.out.println(e.getClass());
        }
    }
}

L'idée de try / catch est d'éviter toute erreur qui pourrait survenir lors de l'exécution de votre programme. Dans votre cas, Scanner file_reader = new Scanner (credentials_file); peut générer une erreur si le credentials_file n'est pas trouvé ou supprimé. Par conséquent, vous devez couvrir cela autour d'un bloc try qui vous donnera une exception qui peut être gérée pour afficher le message de réponse approprié dans le bloc catch .

J'espère que cela vous aidera!


0 commentaires

1
votes

Ajoutez simplement ceci à votre déclaration de méthode:

public static void read() throws FileNotFoundException

Pour savoir comment gérer les exceptions vérifiées en java, vérifiez this (Tutoriels Oracle Docs Java) :

Vous associez des gestionnaires d'exceptions à un bloc try en fournissant un ou plus de blocs catch directement après le bloc try. Aucun code ne peut être compris entre la fin du bloc try et le début du premier bloc catch.

essayez {

} catch (nom ExceptionType) {

} catch (nom ExceptionType) {

}

Et ceci : p>

Parfois, c'est approprié pour que le code détecte les exceptions qui peuvent s'y produire. Dans dans d'autres cas, il vaut mieux laisser une méthode plus loin dans l'appel stack gérer l'exception

public void writeList () lance IOException {

P.S. En outre, il a déjà été discuté sur stackoverflow , donc peut-être devrait être marqué comme dupliqué.


0 commentaires

0
votes

Vous devriez lire l'exception java vérifiée

public static void read() {
    try {
        File credentials_file = new File("credentials.txt");
        Scanner file_reader;
        file_reader = new Scanner(credentials_file);
        String[] users = new String[6];
        int index_counter = 0;

        while (file_reader.hasNextLine()) {
            users[index_counter] = file_reader.nextLine();
        }
        file_reader.close();
    } catch (FileNotFoundException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (Exception e) {
        System.out.println(e.getClass());
    }
}


0 commentaires

2
votes

Je suis d'accord avec les autres réponses concernant le problème (le Scanner peut lancer une exception s'il ne trouve pas le fichier). Je n'ai pas vu ce que je considérerais comme la bonne solution.

    String[] users = new String[6];
    int index_counter = 0;

    File credentials_file = new File("credentials.txt");
    try (Scanner file_reader = new Scanner(credentials_file)) {
        while (file_reader.hasNextLine()) {
            users[index_counter] = file_reader.nextLine();
            index_counter++;
        }
    } catch (FileNotFoundException e) {
        // handle exception
    } catch (NoSuchElementException e) {
        // handle exception
    } catch (IllegalStateException e) {
        // handle exception
    }

Le try-with- L'instruction resources fermera automatiquement le Scanner pour vous. Cela fonctionnera avec n'importe quelle classe qui implémente l'interface AutoCloseable .

Et dans ce cas, cela place l'instruction dans la portée du try , donc les exceptions seront interceptées.

Votre gestion des exceptions est discutable, je ne l'ai donc pas incluse. Mais ce n'est pas vraiment le but ici. Vous pouvez en savoir plus sur les bonnes pratiques pour gérer les exceptions en Java ou sur les Comment spécifier et gérer les exceptions en Java .

Il y a un argument selon lequel vous devriez laisser l'exception remonter jusqu'à l'appelant. Cette réponse explique comment procéder. Mais dans ce cas, l'appelant ne sait pas vraiment comment gérer une FileNotFoundException , car il ne sait rien du fichier. Le fichier est défini dans cette méthode.

Vous pouvez lancer une exception différente, plus explicative. Ou vous pouvez gérer l'exception ici en expliquant ce qu'est un credentials.txt . Ou basculez vers une valeur par défaut. Ou enregistrez simplement l'exception, même si cela est discutable. Si vous faites cela, vous devez expliquer (dans un commentaire) pourquoi cela est suffisant.

J'ai ajouté une ligne pour incrémenter index_counter juste parce qu'elle semblait manquante.

Voir aussi


0 commentaires