そこで、Car オブジェクトの配列をファイルに書き出します。次に、車の変数でそれらを読み戻そうとすると、ステートメントに設定されますcars = (Car[])in.readObject();
。ただし、デバッガーでステップ実行すると、try-catch ブロックを終了すると、cars 変数が「設定解除」されます。
Car[] cars;
try {
ObjectInputStream in = new ObjectInputStream(new FileInputStream(filename)));
cars = (Car[])in.readObject();
in.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
一方、cars 変数をたとえば空の配列に初期化すると、cars 変数は try-catch ブロックの後も設定されたままになります。
Car[] cars = new Car[0];
try {
ObjectInputStream in = new ObjectInputStream(new FileInputStream(filename)));
cars = (Car[])in.readObject();
in.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
では、事前に初期化した場合にのみ、in.readObject で読み取った Car[] への参照が cars 変数に保持されるのはなぜですか? 車を初期化するかどうかに関係なく、なぜ違いが生じるのかわかりません...どちらの方法でも、try-catch ブロックの Car[] オブジェクトを読み取るための参照を取得します。
一部の遅延初期化が発生しているようです..仮想マシンは、try catch-block で cars オブジェクトのスペースを宣言しているだけであるため、ブロックを終了すると範囲外になります...