Frage

Alle,

Ich versuche, um sicherzustellen, dass eine Datei, die ich habe offen mit BufferedReader geschlossen ist, wenn ich eine IOException fangen, aber es scheint, als ob mein BufferedReader-Objekt ist außerhalb des Gültigkeitsbereiches im catch-Block.

public static ArrayList readFiletoArrayList(String fileName, ArrayList fileArrayList)
{
    fileArrayList.removeAll(fileArrayList);

    try {
        //open the file for reading
        BufferedReader fileIn = new BufferedReader(new FileReader(fileName));

        // add line by line to array list, until end of file is reached
        // when buffered reader returns null (todo). 
        while(true){
                fileArrayList.add(fileIn.readLine());
            }
    }catch(IOException e){
        fileArrayList.removeAll(fileArrayList);
        fileIn.close(); 
        return fileArrayList; //returned empty. Dealt with in calling code. 
    }
}

Netbeans beklagt, dass es in dem catch-Block „nicht Symbol FileIn finden“, aber ich will, dass eine IOException in dem Fall gewährleisten, dass der Reader geschlossen wird. Wie kann ich tun, ohne die Hässlichkeit eines zweiten try / catch-Konstrukts um die ersten?

Irgendwelche Tipps oder Hinweise zu Best Practice in dieser Situation sehr geschätzt wird,

War es hilfreich?

Lösung

 BufferedReader fileIn = null;
 try {
       fileIn = new BufferedReader(new FileReader(filename));
       //etc.
 } catch(IOException e) {
      fileArrayList.removeall(fileArrayList);
 } finally {
     try {
       if (fileIn != null) fileIn.close();
     } catch (IOException io) {
        //log exception here
     }
 }
 return fileArrayList;

Ein paar Dinge, über den oben genannten Code:

  • in der Nähe in einem endlich sein sollte, sonst wird es nicht geschlossen werden, wenn der Code abgeschlossen ist normalerweise, oder wenn eine andere Ausnahme neben IOException geworfen wird.
  • Normalerweise haben Sie eine statische Hilfsmethode eine Ressource so zu schließen, so dass es Kontrollen für null und fängt alle Ausnahmen (die Sie nie etwas anderes als log in diesem Zusammenhang tun wollen).
  • Die Rückkehr gehört, nachdem der Versuch, dass beide so der Hauptleitungscode und die Ausnahme abfangen eine Rückkehr Methode ohne Redundanz.
  • Wenn Sie die Rückkehr in den schließlich setzen, wäre es eine Compiler-Warnung erzeugen.

Andere Tipps

Wenn Sie die catch-Block getroffen, werden alle Variablen im Versuch deklariert werden nicht mehr scoped. Deklarieren BufferedReader FileIn = null; über dem try-Block, dann innen zuweisen. In Ihrem catch-Block tun, wenn (FileIn! = Null) fileIn.close ();

Es beschweren sich über das Symbol nicht dort zu sein, weil es nicht. Es ist im try-Block. Wenn Sie FileIn beziehen möchten, müssen Sie es vor dem Versuch erklären.

Es ist jedoch wirklich klingt wie Sie die Nähe in einen finally-Block statt platzieren wollen würde. Sie die Datei unabhängig von Erfolg oder Misserfolg vor der Rückkehr schließen sollte

public static ArrayList readFiletoArrayList(String fileName, ArrayList fileArrayList)
{
    fileArrayList.removeAll(fileArrayList);

    BufferedReader fileIn = null;
    try {
        //open the file for reading
        fileIn = new BufferedReader(new FileReader(fileName));

        // add line by line to array list, until end of file is reached
        // when buffered reader returns null (todo). 
        while(true){
                fileArrayList.add(fileIn.readLine());
            }
    }catch(IOException e){
        fileArrayList.removeAll(fileArrayList); 
    }finally{
        if(fileIn != null) fileIn.close();
    }
    return fileArrayList;
}

Meine bevorzugte Art und Weise clean-up der Durchführung nach einer Ausnahme (wenn die Clean-up kann möglicherweise auch eine Ausnahme auslösen) ist den Code im try-Block in einem anderen Versuch zu setzen / finally-Block wie folgt:

public static ArrayList readFiletoArrayList(String fileName, ArrayList fileArrayList) {
    fileArrayList.removeAll(fileArrayList);

    try {
        //open the file for reading
        BufferedReader fileIn = null;

        try {
            fileIn = new BufferedReader(new FileReader(fileName));
            // add line by line to array list, until end of file is reached
            // when buffered reader returns null (todo). 
            while(true){
                fileArrayList.add(fileIn.readLine());
            }
        } finally {
            if (fileIn != null) {
                fileIn.close();
            }
        }
    }catch(IOException e){
        fileArrayList.removeAll(fileArrayList);
        return fileArrayList; //returned empty. Dealt with in calling code. 
    }
}

Bewegen Sie die Erklärung aus dem try-Block:

public static ArrayList readFiletoArrayList(String fileName, ArrayList fileArrayList)
{
    fileArrayList.removeAll(fileArrayList);

    BufferedReader fileIn = null;
    try {
        //open the file for reading
        fileIn = new BufferedReader(new FileReader(fileName));

        // add line by line to array list, until end of file is reached
        // when buffered reader returns null (todo). 
        while(true){
                fileArrayList.add(fileIn.readLine());
            }
    }catch(IOException e){
        fileArrayList.removeAll(fileArrayList);
        fileIn.close(); 
        return fileArrayList; //returned empty. Dealt with in calling code. 
    }
}

Aber Sie müssen noch vorsichtig sein, dass fileIn, bevor sie tatsächlich initialisiert wurde versucht, um es zu schließen:

if (fileIn != null)
    fileIn.close();

Deklarieren Sie die BufferedReader außerhalb des Try-Block und setzen Sie ihn auf Null dann blockieren ein schließlich verwenden Sie es, wenn ihr nicht null zu schließen. Auch fileArrayList wird als Referenz übergeben, so Änderungen vorgenommen, um es auf das Objekt passieren wird Sie in vergangen, so dass keine Notwendigkeit besteht, auch sie zurück.

    public static ArrayList readFiletoArrayList(String fileName, ArrayList fileArrayList)
{
    fileArrayList.removeAll(fileArrayList);
    BufferedReader fileIn = null;
    try {
        //open the file for reading
        fileIn = new BufferedReader(new FileReader(fileName));

        // add line by line to array list, until end of file is reached
        // when buffered reader returns null (todo). 
        while(true){
                fileArrayList.add(fileIn.readLine());
            }
    }catch(IOException e){
        fileArrayList.removeAll(fileArrayList);  
    }finally
    {
       try
       {
           if(fillIn != null)
               fileIn.close();
       }
       catch(IOException e){}
    }
    return fileArrayList; //returned empty. Dealt with in calling code.
}

Es ist besser, nicht mit null umgehen - ist :

final Resource resource = acquire();
try { use(resource); }
finally { resource.release(); }

so:

public static List<String> readFiletoArrayList(String fileName,
        List<String> fileArrayList, String charsetName) {
    fileArrayList.clear(); // why fileArrayList.removeAll(fileArrayList) ?
    try {
        InputStream file = new FileInputStream(fileName);
        try {
            InputStreamReader reader = new InputStreamReader(file, charsetName);
            BufferedReader buffer = new BufferedReader(reader);
            for (String line = buffer.readLine(); line != null; line = buffer
                    .readLine()) {
                fileArrayList.add(line);
            }
        } finally {
            try {
                file.close();
            } catch (IOException e) {
                e.printStackTrace(); // you do not want this to hide an
                // exception thrown earlier so swallow it
            }
        }
    } catch (IOException e) {
        fileArrayList.clear(); // returned empty. Dealt with in client
    }
    return fileArrayList;
}

meine Punkte Siehe hier

Wenn Sie einen Leser verwenden Sie müssen geben Sie die Codierung, wie ich hier tue. Wenn Sie möchten, um den Leser lesen Bytes zu vergessen. Auch wenn Sie readLine() verwenden, müssen Sie über das Ende der Zeile Zeichen vergessen -. Wenn dies ein Problem ist, betrachten völlig die BufferedReader Weglassen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top