Pergunta

Estou tentando usar um pouco de código que encontrei na parte inferior de esta página. Aqui está o código em uma classe que eu criei para ele:

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

Meu objetivo é contar as linhas de um arquivo de texto, armazenar esse número como um número inteiro e usar esse número inteiro na minha classe principal. Na minha aula principal, tentei algumas maneiras diferentes de fazer isso acontecer, mas (sendo um novo programador) estou perdendo alguma coisa. Aqui está a primeira coisa que tentei:

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

Com essa tentativa, recebo o erro "Exceção não relatada java.io.ioException; deve ser pego ou declarado ser jogado". Não entendo por que estou conseguindo isso porque, como posso ver, a exceção é declarada no meu método "Countlines". Tentei usar um bloco de tentativa de Catch bem nesse último código que publiquei, mas isso também não funcionou (acho que não fiz certo). Aqui está minha tentativa de tentar:

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

Por favor, me mostre o caminho! Agradeço antecipadamente por sua ajuda!

Foi útil?

Solução

O bloco inicializador é como qualquer bits de código; Não está "anexado" a qualquer campo/método que o precede. Para atribuir valores aos campos, você deve usar explicitamente o campo como LHS de uma instrução de atribuição.

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

Além disso, você countLines pode ser tornado mais simples:

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

Com base no meu teste, parece que você pode getLineNumber() depois close().

Outras dicas

A razão pela qual você está obtendo a IoException é porque você não está capturando a ioexception do seu método Countlines. Você vai querer fazer algo assim:

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

Sua countLines(String filename) O método lança ioexception.

Você não pode usá -lo em uma declaração de membro. Você precisará executar a operação em um main(String[] args) método.

Sua main(String[] args) O método será lançado a IoException a ele por contagens e precisará lidar ou declará -lo.

Tente isso para apenas jogar a ioexception da principal

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

Ou isso para lidar com isso e envolvê -lo em uma ilegalArgumentException não verificada:

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);
     }
  }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top