2013-03-07 9 views
5
public static int howMany(String FileName) 
{ 
    BufferedReader br = null; 

    try 
    { 
     FileInputStream fis = new FileInputStream(FileName); 
     DataInputStream dis = new DataInputStream(fis); 
     br = new BufferedReader(new InputStreamReader(dis)); 
    } 
    catch (FileNotFoundException e) 
    { 
     System.out.print("FILE DOESN'T EXIST"); 
    } 
    finally 
    { 
     fis.close(); 
     dis.close(); 
     br.close(); 
    } 


    String input; 
    int count = 0; 

    try 
    { 

     while ((input = br.readLine()) != null) 
     { 
      count++; 
     } 

    } 
    catch (IOException e) 
    { 
     System.out.print("I/O STREAM EXCEPTION"); 
    } 


    return count; 
} 

何らかの理由で、I/Oオブジェクトを閉じることができません。すべてのI/Oライブラリ(import java.io. *;)をインポートしてすべてのオブジェクトを開始しても、fis.close()、dis.close()、br.close()はシンボルを見つけることができません。I/Oオブジェクトを閉じるときに「シンボルを見つけることができません」

+0

hurrエラーが発生する:報告されない例外IOException;キャッチされるか、今度は3回投げられると宣言されなければならない –

答えて

5
BufferedReader br = null; 
FileInputStream fis =null; 
DataInputStream dis null; 
try { 
    fis = new FileInputStream(FileName); 
    dis = new DataInputStream(fis); 
    br = new BufferedReader(new InputStreamReader(dis)); 
} 

try blockから最終ブロックに変数が表示されるようにしてください。

+0

hurrエラーが発生する:報告されない例外IOException;キャッチされるか、今度は3回投げられると宣言されなければならない –

+0

@MatthewLochは別のキャッチブロックを置き、IOExceptionを捕まえる。 (FileNotFound){} catch(IOException) – PermGenError

+0

それは決して固定されていません –

1

あなたがそうでなければ、彼らはfinallyブロックに表示されません、tryブロック外すべてストリームを宣言する必要があります。

FileInputStream fis = null; 
DataInputStream dis = null; 
BufferedReader br = null; 

また、あなたがリソースを自動化するためにJava 7の新しいtry-with-resources構文を使用することができます閉鎖。

1

あなたのオブジェクトが

FileInputStream fis =null; 
DataInputStream dis null; 

が最終がわからないようにするには、tryブロック内にfisをスコープしている。この

try{ 

    fis = new FileInputStream(FileName); 
    dis = new DataInputStream(fis); 

    } 
0

のようなブロック何か外にそれらを定義あなたのブロック内のヌルされていますそれはそこにあります。試してみてください:コンパイラはあなたがfinallyブロックで参照している変数は、既存の答えが適切にカバーしている時点で、範囲に含まれていないことを不平を言っている

BufferedReader br = null; 
FileInputStream fis = null; 
DataInputStream dis = null; 
try 
{ 
    fis = new FileInputStream(FileName); 
    dis = new DataInputStream(fis); 
    br = new BufferedReader(new InputStreamReader(dis)); 
} 
0

はこれを試してみてください。しかし、ここには他にも多くの問題があります。

ここで大きな問題は、BufferedReaderを閉じた後で参照しようとしていることです。カウントロジックを最初のtryブロックに移動し、2番目のtryブロックを削除します。

例のようにリーダーとストリームを結合すると、一番外側のものだけを閉じる必要があります。 BufferedReaderは、渡されたリーダーへの参照を保存し、それが存在するときに閉じられることを確認します。同様に、InputStreamReaderは渡された入力ストリームを閉じ、渡されたfileInputStreamを閉じます。

FISとDISの変数を使用すると、巣コンストラクタ呼び出しすることができ、必要でさえありません。悪いfinallyブロック内に複数の近くに置く

br = new BufferedReader(new InputStreamReader(
     new DataInputStream(new FileInputStream(FileName)))); 

。例外が発生してこれらのいずれかを閉じると、残りのリソースはクローズされません。

また、finallyブロックでスローされた例外は、tryブロックでスローされたすべての例外をマスクします。オリジナルの例外(何が間違っていたかに関する情報)は破棄され、クローズ時にスローされた例外(有益ではない)は伝播される例外です。

try-with-resourcesをチェックアウトすると、複数のリソースを閉じることや例外マスキングの可能性を排除することができます。

0

FileInputStream fis; 
DataInputStream dis; 
try 
    { 
     fis = new FileInputStream(FileName); 
     dis = new DataInputStream(fis); 
     br = new BufferedReader(new InputStreamReader(dis)); 
    } 
関連する問題