web-dev-qa-db-ja.com

Java IOException問題を試行してキャッチ

このページ の下部にあるコードを使用しようとしています。これは私が作成したクラスのコードです:

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;
  }
}

私の目的は、テキストファイルの行を数え、その数を整数として保存し、その整数をメインクラスで使用することですメインクラスこれを実現するためにいくつかの異なる方法を試しましたが、(新しいプログラマーとして)何かが足りません。これが私が試した最初のことです:

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

この試みにより、「報告されていない例外Java.io.IOException;スローするためにキャッチまたは宣言する必要がある」というエラーが発生します。ご覧のとおり、「countLines」メソッドで例外が宣言されているため、なぜこれが発生するのか理解できません。私が投稿した最後のコードのすぐ下でtry catchブロックを使用しようとしましたが、それも機能しませんでした(ただし、正しく実行したとは思いません)。ここに私のトライキャッチの試みがあります:

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);
    }
}

道を教えてください!よろしくお願いします!

9
ubiquibacon

イニシャライザブロックは、コードのビットと同じです。それより前のフィールド/メソッドには「アタッチ」されていません。フィールドに値を割り当てるには、フィールドを割り当てステートメントのlhsとして明示的に使用する必要があります。

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

また、countLinesをより簡単にすることができます。

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

私のテストに基づいて、getLineNumber()の後にclose()を実行できるように見えます。

5

countLines(String filename)メソッドがIOExceptionをスローします。

メンバー宣言では使用できません。 main(String[] args)メソッドで操作を実行する必要があります。

main(String[] args)メソッドは、countLinesによってスローされたIOExceptionを取得し、それを処理または宣言する必要があります。

これを試して、メインからIOExceptionをスローするだけです

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

またはこれを処理して、チェックされていないIllegalArgumentExceptionにラップします。

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

IOExceptionが発生するのは、countLinesメソッドのIOExceptionをキャッチしていないためです。あなたはこのようなことをしたいと思うでしょう:

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