2010-03-07 7 views
6

Estoy tratando de usar un poco de código que encontré en la parte inferior de this page. Aquí está el código en una clase que he creado para ella:Java Try y Catch IOException Problema

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

Mi objetivo es contar las líneas de un archivo de texto, guardar ese número como un entero, a continuación, utilizar ese entero en mi clase principal. En mi clase principal probé algunas formas diferentes de hacer que esto sucediera, pero (como programador nuevo) me falta algo. Esta es la primera cosa que probé:

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

Con este intento me sale el error "java.io.IOException excepción no declarada; deben ser capturados o declarada a ser lanzado." No entiendo por qué estoy recibiendo esto porque, como puedo ver, la excepción se declara en mi método "countLines". Traté de usar un bloque catch try justo debajo del último código que publiqué, pero tampoco funcionó (aunque creo que no lo hice bien). Aquí está mi intento de captura de captura:

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, muéstrame el camino! ¡Gracias de antemano por tu ayuda!

Respuesta

3

bloque inicializador es igual que cualquier trozo de código; no está "conectado" a ningún campo/método que lo preceda. Para asignar valores a campos, debe usar explícitamente el campo como lhs de una declaración de asignación.

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

Además, su countLines se pueden hacer más simple:

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

Basado en mi prueba, parece que se puede getLineNumber() después close().

+1

La respuesta es técnicamente correcta (el OP simplemente olvidó asignar el valor a la referencia), pero ese no era un bloque de inicializador ** estático **. Es solo un bloque de inicialización :) – BalusC

+0

¡Tu primer código funciona perfecto! Estaba tan cerca :) Tu segundo código también funciona, pero NetBeans me dice que el ciclo while está vacío. El programa aún se compila y funciona bien, entonces supongo que eso es aceptable. – ubiquibacon

+0

Simplemente está ignorando el contenido.En realidad, solo está interesado en la cantidad de líneas. Alternativamente, también puede usar 'BufferedReader' en combinación con' int count', que se incrementa dentro del ciclo. – BalusC

1

Su método countLines(String filename) arroja IOException.

No puede usarlo en una declaración de miembro. Tendrá que realizar la operación en un método main(String[] args).

El método main(String[] args) recibirá la IOException arrojada por countLines y deberá manejarlo o declararlo.

probar este a tiro el IOException de la principal

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

o de este a manejarlo y lo envuelve en una IllegalArgumentException sin control:

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

¡Lo sentimos, leí la pregunta al principio! – Brabster

+0

Gracias por su respuesta, ¡todos son geniales! – ubiquibacon

1

La razón por la que recibe la excepción IOException es porque no está obteniendo la IOException de su método countLines. Querrá hacer algo como esto:

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

¡Gracias por la respuesta! – ubiquibacon