所以我将一个 Car 对象数组写到一个文件中。然后,当我尝试在汽车变量中读回它们时,我会在语句中设置cars = (Car[])in.readObject();
。但是,当我使用调试器逐步完成它时,一旦我退出 try-catch 块,汽车变量就会“取消设置”。
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();
}
另一方面,如果我初始化汽车变量,例如初始化为一个空数组,汽车变量在 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[] 的引用,前提是我事先对其进行了初始化?我不明白为什么无论我是否初始化汽车都会有任何区别......无论哪种方式,它都会在 try-catch 块中获取读取 Car[] 对象的引用。
似乎正在发生一些延迟初始化......虚拟机只是在 try catch 块中为汽车对象声明空间,因此当它退出块时它超出范围......