2010-03-07 6 views
6

Ich versuche, ein wenig Code zu verwenden, den ich am Ende der this page gefunden habe. Hier ist der Code in einer Klasse, die ich für sie geschaffen:Java versuchen und fangen IOException Problem

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

Mein Ziel ist es, die Zeilen einer Textdatei zu zählen, speichert diese Zahl als Integer, verwenden Sie dann diese ganze Zahl in meiner Hauptklasse. In meiner Hauptklasse versuchte ich ein paar verschiedene Möglichkeiten, dies zu erreichen, aber (als neuer Programmierer) vermisse ich etwas. Hier ist das erste, was ich versuchte:

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

Mit diesem Versuch bekomme ich die Fehlermeldung „nicht gemeldete Ausnahme java.io.IOException, muß gefangen oder deklariert werden geworfen werden.“ Ich verstehe nicht, warum ich das bekomme, weil, wie ich sehen kann, die Ausnahme in meiner "countLines" -Methode deklariert ist. Ich habe versucht, einen try catch-Block direkt unter dem letzten Code zu verwenden, den ich gepostet habe, aber das hat auch nicht funktioniert (ich glaube nicht, dass ich es richtig gemacht habe). Hier ist mein Versuch, Versuch zu fangen:

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

Bitte zeigen Sie mir den Weg! Vielen Dank im Voraus für Ihre Hilfe!

Antwort

3

Initializer Block genauso wie alle Bits des Codes ist; Es ist nicht an ein Feld/eine Methode angehängt, die diesem vorangeht. Um Feldern Werte zuzuweisen, müssen Sie das Feld explizit als die Links einer Zuweisungsanweisung verwenden.

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

Auch Ihre countLines kann einfacher gemacht werden:

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

auf meinem Test Basierend sieht es aus wie Sie können getLineNumber() nach close().

+1

Die Antwort ist technisch korrekt (das OP hat einfach vergessen, den Wert der Referenz zuzuweisen), aber das war kein ** statischer ** Initialisierungsblock. Es ist nur ein Initialisierungsblock :) – BalusC

+0

Ihr erstes Bit Code funktioniert perfekt! Ich war so nah :) Ihr zweites Bit Code funktioniert auch, aber NetBeans sagt mir, dass die While-Schleife leer ist. Das Programm kompiliert und läuft noch in Ordnung, also denke ich, dass das akzeptabel ist? – ubiquibacon

+0

Es ignoriert einfach den Inhalt.Sie interessieren sich eigentlich nur für die Anzahl der Zeilen. Sie können alternativ auch 'BufferedReader' in Kombination mit' int count' verwenden, die Sie innerhalb der Schleife erhöhen. – BalusC

1

Ihre countLines(String filename)-Methode löst IOException aus.

Sie können es nicht in einer Memberdeklaration verwenden. Sie müssen die Operation in einer main(String[] args) Methode durchführen.

Ihre main(String[] args)-Methode wird die IOException von countLines ausgelöst und muss sie behandeln oder deklarieren.

diese versuchen, nur aus den IOException zu werfen Haupt

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

oder diese damit umgehen und es in einem ungeprüften Illegal wickeln:

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

Sorry, falsch gelesen die Frage zuerst! – Brabster

+0

Danke für Ihre Antwort, Sie sind alle großartig! – ubiquibacon

1

Der Grund für die IOException liegt darin, dass Sie die IOException Ihrer countLines-Methode nicht abfangen. Sie werden so etwas tun wollen:

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

Danke für die Antwort! – ubiquibacon