1

変数finを初期化するように求められるのはなぜですか

FileInputStream fin;
File f = new File("C:/Users/NetBeansProjects/QuestionOne/input.txt");
fin = new FileInputStream(f);

ファイルを閉じようとしたとき

fin.close();
4

2 に答える 2

3

これは、コンパイラ エラーを生成したコードとまったく同じではないに違いありません。try-catch-finally ブロックの外で変数を宣言したが、try ブロック内で変数を初期化したことはほぼ確実です。これは、コンパイラ エラーが発生している catch または finally ブロックのコンテキストで変数が初期化されていない可能性があることを意味します。

例えば:

FileInputStream fin;
try {
   File f = new File("C:/Users/NetBeansProjects/QuestionOne/input.txt");
   fin = new FileInputStream(f);
} finally {
   //you cannot be sure fin is initialized
   fin.close(); //compiler error
}

JDK 7 を使用している場合、おそらく最善の方法は、try with resources を使用してストリームの終了を処理することです。

File f = new File("C:/Users/NetBeansProjects/QuestionOne/input.txt");
try(FileInputStream fin=new FileInputStream(f)) {
    //some input stream handlung here
}catch(IOException e){...} 
于 2012-11-03T07:10:36.990 に答える
2

このスニペットを関数内で使用している可能性が高く、関数内の変数は自動的に初期化されないためですinstance variables。例外がスローされ、ステートメントに含まれfin = new FileInputStream(f);ていると思いますが(ただし、コード全体を入れていません)、コンパイラはそれを閉じるために の値がどれであるかを知りません。fin.close();finallyfin

于 2012-11-03T07:13:45.973 に答える