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" методе. Я пытался использовать блок выгоды попытки прямо под тем последним битом кода, который я отправил, но это не работало ни один (я не думаю, что сделал его правильно хотя). Вот моя попытка выгоды попытки:

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
задан Community 23 May 2017 в 11:48
поделиться

3 ответа

Блок инициализатора подобен любым битам кода; он не «привязан» к какому-либо предшествующему полю / методу. Чтобы присвоить значения полям, вы должны явно использовать это поле в качестве левой части оператора присваивания.

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
ответ дан 4 December 2019 в 23:06
поделиться

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

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
ответ дан 4 December 2019 в 23:06
поделиться

Ваш метод countLines(String filename) бросает IOException.

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

Ваш метод main(String[] args) получит IOException, брошенный ему countLines, и ему нужно будет обработать или объявить его.

Попробуйте это, чтобы просто выбросить IOException из main

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
ответ дан 4 December 2019 в 23:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: