2011-12-07 4 views
0

これはコードで、私の質問はなぜFileReader inputstream = null;FileWriterと同じものを入れなければならないのですか? tryブロックの後半でオブジェクトを作成するだけの理由はありますか?私は何かを逃しています...私はおそらくです。オブジェクト自体を作成するときに、FileReader/WriterタイプのinputStreamとoutputStreamを作成する必要があるのはなぜですか?

public static void main(String[] args) throws IOException{ 
    // TODO Auto-generated method stub 
     FileReader inputStream = null; 
     FileWriter outputStream = null; 
     try { 
      inputStream = new FileReader("In.txt"); 
      outputStream = new FileWriter("Out.txt"); 
      int c; 
      while ((c = inputStream.read()) != -1){ 
       outputStream.write(c); 

      } 
     } 
       finally { 
        if (inputStream != null){ 
         inputStream.close(); 
        } 
        if (outputStream != null){ 
         outputStream.close(); 

       } 
     } 

答えて

2

あなたはfinallyブロックにそれらを参照することができなくなりますので、ので、あなたはそれらを閉じることはできません。

Btwの場合、リーダーとライターの場合は、xStreamではなく、変数の名前を付けてください。

I/O処理が常にあるのでFileReader inputstream = nullであなたは、1にinputStreamという名前だけで参照するオブジェクトを作成できませんんのJava 7が"try with resource"

+0

ありがとうございます。私はmacosxと私は学校のプロパティですので、私は何も6を使用することはできません。 – poetzmij

0

を導入理由です、退屈されています。どれ?いずれも、参照はnullで初期化されます。後でオブジェクトを作成する場合と作成しない場合があります(ただし、new FileReader(...)が例外をスローするとどうなりますか?)。 finallyブロックのチェックは、初期化された変数を処理する必要があります。

0

これはすべて明確な割り当てルールに関するものです。 Javaは、変数が初期化されていることが保証できる場合にのみ、ローカル変数を使用できるようにします。

はあなたのコードのこの簡易版考えてみます。

FileReader inputStream; // not initialized here ... 
    try { 
     inputStream = new FileReader("In.txt"); 
     // do stuff 
    } finally { 
     if (inputStream != null) { 
      inputStream.close(); 
     } 
    } 

はありませんFileReaderコンストラクタはIn.txtファイルが見つからないと仮定して、FileNotFoundExceptionをスローします。コンストラクタは "異常終了"し、値はinputStreamに割り当てられません。次にfinallyブロックに到着し、ここでinputStreamnullではないことをテストしようとします。しかしその時点ではまだinputStreamは初期化されておらず、Javaでは初期化されていないローカル変数の値を取ることができず、コンパイルエラーが発生します。

からinputStreamへの無駄な割り当ては、finallyブロックに到達したときに変数が常に初期化されていることを保証することによって問題を解決します。


Java言語仕様では、完全な章で明確な割り当てルールを指定しています。変数が任意の時点で初期化されているかどうかを決定するためにコンパイラが使用する規則です。これらの規則はかなり控えめであり、場合によっては、大きな頭脳の人間がそれを推論できるときに、コンパイラが何かが明確に割り当てられていないと言うでしょう。あなたはそれだけで生活しなければならず、実行されることのない不要な初期化やreturnステートメントを追加することがあります。

0

Iは、しばしば以下

FileReader in = new FileReader("In.txt"); 
try { 
    // do reading 
} finally { 
    in.close(); 
} 

を使用するこれは、封入方法はIOExceptionを(すなわちにFileNotFoundException)をスローします。 これもJava 7に適合します。

try (FileReader in = new FileReader("In.txt"); FileWriter ...) { 
    // do reading 
} 
関連する問題