web-dev-qa-db-fra.com

Java Essayez et attrapez le problème IOException

J'essaie d'utiliser un peu de code que j'ai trouvé au bas de cette page . Voici le code d'une classe que j'ai créée pour lui:

import Java.io.LineNumberReader;
import Java.io.FileReader;
import Java.io.IOException;

public class LineCounter {
  public static int countLines(String filename) throws IOException {
    LineNumberReader reader  = new LineNumberReader(new FileReader(filename));
    int cnt = 0;
    String lineRead = "";
    while ((lineRead = reader.readLine()) != null) {}
    cnt = reader.getLineNumber();
    reader.close();
    return cnt;
  }
}

Mon objectif est de compter les lignes d'un fichier texte, de stocker ce nombre sous forme d'entier, puis d'utiliser cet entier dans ma classe principale. Dans ma classe principale J'ai essayé plusieurs façons de réaliser cela, mais (étant un nouveau programmeur) il me manque quelque chose. Voici la première chose que j'ai essayée:

String sFileName = "MyTextFile.txt";
private int lineCount = LineCounter.countLines(sFileName);

Avec cette tentative, j'obtiens l'erreur "exception non signalée Java.io.IOException; doit être interceptée ou déclarée comme levée". Je ne comprends pas pourquoi j'obtiens ceci parce que comme je peux voir l'exception est déclarée dans ma méthode "countLines". J'ai essayé d'utiliser un bloc try catch juste sous le dernier morceau de code que j'ai publié, mais cela n'a pas fonctionné non plus (je ne pense pas que je l'ai fait correctement). Voici ma tentative de capture:

String sFileName = "MyTextFile.txt";
private int lineCount;{
    try{
        LineCounter.countLines(sFileName);
    }
    catch(IOException ex){
        System.out.println (ex.toString());
        System.out.println("Could not find file " + sFileName);
    }
}

Veuillez me montrer le chemin! Merci d'avance pour votre aide!

9
ubiquibacon

Le bloc d'initialisation est comme tous les bits de code; il n'est "attaché" à aucun champ/méthode qui le précède. Pour affecter des valeurs aux champs, vous devez utiliser explicitement le champ comme lhs d'une instruction d'affectation.

private int lineCount; {
    try{
        lineCount = LineCounter.countLines(sFileName);
        /*^^^^^^^*/
    }
    catch(IOException ex){
        System.out.println (ex.toString());
        System.out.println("Could not find file " + sFileName);
    }
}

De plus, votre countLines peut être simplifié:

  public static int countLines(String filename) throws IOException {
    LineNumberReader reader  = new LineNumberReader(new FileReader(filename));
    while (reader.readLine() != null) {}
    reader.close();
    return reader.getLineNumber();
  }

D'après mon test, il semble que vous pouvez getLineNumber() après close().

5

Votre méthode countLines(String filename) lève IOException.

Vous ne pouvez pas l'utiliser dans une déclaration de membre. Vous devrez effectuer l'opération dans une méthode main(String[] args).

Votre méthode main(String[] args) obtiendra l'IOException qui lui sera lancée par countLines et devra la gérer ou la déclarer.

Essayez ceci pour simplement lancer l'exception IOException à partir de main

public class MyClass {
  private int lineCount;
  public static void main(String[] args) throws IOException {
    lineCount = LineCounter.countLines(sFileName);
  }
}

ou ceci pour le gérer et l'envelopper dans une exception IllegalArgumentException non cochée:

public class MyClass {
  private int lineCount;
  private String sFileName  = "myfile";
  public static void main(String[] args) throws IOException {
    try {
      lineCount = LineCounter.countLines(sFileName);
     } catch (IOException e) {
       throw new IllegalArgumentException("Unable to load " + sFileName, e);
     }
  }
}
1
brabster

La raison pour laquelle vous obtenez l'exception IOException est que vous n'attrapez pas l'exception IOException de votre méthode countLines. Vous voudrez faire quelque chose comme ceci:

public static void main(String[] args) {
  int lines = 0;  

  // TODO - Need to get the filename to populate sFileName.  Could
  // come from the command line arguments.

   try {
       lines = LineCounter.countLines(sFileName);
    }
    catch(IOException ex){
        System.out.println (ex.toString());
        System.out.println("Could not find file " + sFileName);
    }

   if(lines > 0) {
     // Do rest of program.
   }
}
1
JasCav