Вопрос

Я пытаюсь использовать немного кода, который я нашел внизу эта страница. Отказ Вот код в классе, который я создал для него:

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; должны быть пойманы или объявлены, чтобы быть брошены». Я не понимаю, почему я получаю это, потому что, как я вижу, исключение объявлено в моем методе «CONCTLINES». Я пытался использовать попытку CALL Block прямо под этим последним битом кода, который я разместил, но это тоже не работал (я не думаю, что сделал это правильно). Вот моя попытка поймать попытку:

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

Пожалуйста, покажите мне путь! Заранее спасибо за вашу помощь!

Это было полезно?

Решение

Блок инициализатора работает как любые биты кода; Это не «прикреплено» к любому полю / методу, предшествующему ему. Чтобы назначить значения на поля, вы должны явно использовать поле в качестве 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().

Другие советы

Причина, по которой вы получаете IOException, заключается в том, что вы не ловите IOException ваших методов COCCLINES. Вы захотите сделать что-то вроде этого:

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

Твой countLines(String filename) Метод бросает ioException.

Вы не можете использовать его в декларации членов. Вам нужно будет выполнить операцию в main(String[] args) метод.

Твой main(String[] args) Метод получит сброс IOException к его CountLines, и ему нужно будет обращаться или объявить его.

Попробуйте просто бросить ioException из основных

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

Или это, чтобы справиться с ним и обернуть его в незарегистрированном нелегалярную функцию:

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);
     }
  }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top