16
try {
    FileReader fr = new FileReader(file);
    BufferedReader br = new BufferedReader(fr);
    String line = null;
} catch (FileNotFoundException fnf) {
    fnf.printStackTrace();
} finally {
    fr.close();
}

fr.close()エラーを示しています:

frを解決できません

finallyブロックでファイルを閉じるのは良い習慣だと読んだことがあります。
それは何が間違っているのですか?

4

4 に答える 4

30

変数には、ブロックfr内のスコープのみがあります。tryこれはfinallyブロックの範囲外です。ブロックのに宣言する必要があります。try

FileReader fr = null;
try {
    fr = new FileReader(file);
    BufferedReader br = new BufferedReader(fr);
    String line = null;
} catch (FileNotFoundException e) {
    e.printStackTrace();
} finally {
    if (fr != null) {
        try {
            fr.close();
        } catch (IOException e) {
            // This is unrecoverable. Just report it and move on
            e.printStackTrace();
        }
    }
}

これは非常に一般的なコードパターンであるため、将来の同様の状況に備えて覚えておくとよいでしょう。

このメソッドからスローすることを検討してくださいIOException-トラックトレースの印刷は呼び出し元にとってあまり役に立ちません。ネストされたtrycatcharoundは必要ありませんfr.close()

于 2012-01-24T03:17:00.910 に答える
9

最後に、ブロックは必要ありません。

try (FileReader fr = new FileReader(file);
    BufferedReader br = new BufferedReader(fr);){

    String line = null;

    }

} catch(FileNotFoundException fnf) {
    fnf.printStackTrace();
} 

リーダーを自動的に閉じるようになりました

于 2012-01-24T03:21:05.243 に答える
0

スコープに問題があります。その構文を本当に使用したい場合は、次のように修正する必要があります。

FileReader fr = null;
try {
    fr = new FileReader(file);
    BufferedReader br = new BufferedReader(fr);
    String line = null;
} catch (FileNotFoundException fnf) {
    fnf.printStackTrace();
} finally {
    if( fr != null)
       fr.close();
}

そうすれば、frはfinallyのブロックスコープに存在します。

于 2012-01-24T03:27:03.227 に答える
0
public static void main(String[] args) throws IOException{
        FileReader file1 = null;
        try{
            file1 = new FileReader("blaaa.txt");//this file does not exist
        }
        catch (FileNotFoundException e){}
        catch (IOException e)  {e.printStackTrace();}
        finally {
            try{file1.close();}
            catch (NullPointerException e){
            }
            finally {
                System.out.println("Thank you, please try again");
            }
        }
    }
于 2022-01-22T04:36:14.330 に答える