JavaでIOExceptionをキャッチした後、ファイルを閉じるにはどうすればよいですか?
-
27-09-2019 - |
質問
全て、
ioExceptionをキャッチすると、バッファレッドリーダーを使用して開いているファイルが閉じていることを確認しようとしていますが、バッファレッドリーダーオブジェクトがキャッチブロックで範囲外であるように見えます。
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は、キャッチブロックで「シンボルファイルを見つけることができない」と不満を述べていますが、IOExceptionの場合、読者が閉じられていることを確認したいと思います。最初の2回目のトライ/キャッチコンストラクトのugさなしに、どうすればそれを行うことができますか?
この状況でベストプラクティスに関するヒントやポインターは高く評価されています、
解決
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;
上記のコードに関するいくつかのこと:
- 最終的には、最終的に閉じます。そうしないと、コードが正常に完了したときに閉じられません。
- 通常、nullをチェックして例外をキャッチするように、そのようなリソースを閉じる静的ユーティリティ方法があります(このコンテキストでログ以外に何もしたくない)。
- リターンは試行後に属し、メインラインコードと例外キャッチングの両方が冗長性のない返品方法を持つようにします。
- 最終的にリターンを入力すると、コンパイラ警告が生成されます。
他のヒント
キャッチブロックを押すと、試行中に宣言された変数はもうスコープされていません。 bufferedreader filein = nullを宣言します。トライブロックの上に、内部に割り当てます。キャッチブロックで、if(filein!= null)filein.close();
それはそうではないので、シンボルがそこにないことについて不平を言っています。それはトライブロックにあります。 fileinを参照する場合は、試行以外で宣言する必要があります。
ただし、代わりに最終的にブロックに閉じているように聞こえます。戻る前に成功や失敗に関係なく、ファイルを閉じる必要があります。
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;
}
例外の後にクリーンアップを実行する私の好ましい方法(クリーンアップが例外をスローする可能性がある場合)は、次のように次のように、別のトライ/最終的なブロック内にトライブロックにコードを入れることです。
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.
}
}
Tryブロックから宣言を移動します。
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.
}
}
しかし、あなたはまだそれに注意する必要があります fileIn
閉じる前に実際に初期化されました:
if (fileIn != null)
fileIn.close();
BufferedReaderをTryブロックの外側に宣言し、nullに設定し、最終的にブロックを使用してnullでない場合は閉じます。また、FilearrayListは参照によって渡されるため、渡されたオブジェクトに変更された変更が発生するため、返品する必要はありません。
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.
}
対処しない方が良いです null
- Javaでのリソースの獲得とリリースのための一般的なイディオムは :
final Resource resource = acquire();
try { use(resource); }
finally { resource.release(); }
それで:
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;
}
私のポイントを見てください ここ
読者を使用している場合 しなければならない readLine()
あなたは線の終わりの文字を忘れる必要があります - これが懸念の場合は、 BufferedReader
全体的に。