因此,我将 Car 对象数组写入文件。然后当我尝试在 cars 变量中读回它们时,我在语句上设置了它们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();
}
另一方面,如果我初始化 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();
}
那么,为什么 cars 变量仅在我事先初始化时才保留对我用 in.readObject 读入的 Car[] 的引用呢?我不明白为什么无论是否初始化汽车都会有任何区别......无论哪种方式,它都会在 try-catch 块中获取读取 Car[] 对象的引用。
似乎正在发生一些延迟初始化......虚拟机只是在 try catch 块中为 cars 对象声明空间,因此当它退出块时它会超出范围......
它不会被“取消设置”——但你不能read的价值cars
在代码之后try/catch
在第一个示例中阻止,因为它不是明确指定。 (如果您尝试这样做,您将收到编译时错误。)如果在前两个语句中的任何一个中抛出异常try
块,不会为其分配任何值。
您可以通过以下方式修复此问题not只是盲目地捕获异常并在打印堆栈跟踪后继续:
- 仅捕获您感兴趣的特定异常。
catch (Exception e)
差不多always一个坏主意
- 你不一定需要捕捉任何东西 - 你的方法实际上可以吗handle例外吗?如果没有,就声明它可能会被抛出。你总是可以抓住并重新扔掉它。
- 如果可以的话really处理它,也许你实际上应该分配一个默认值在 catch 块中
如果你遵循这些要点(要么重新抛出,让它冒泡,要么分配一个适当的值),那么变量肯定会被分配,一切都会好起来的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)