我尝试反序列化文件并得到 FileNotFoundException。程序启动时,
.cycles
文件不存在。
Cycles сl;
try {
сl = Cycles.deserialize();
logger.info("The Cycles object was successfully deserialized");
} catch (IOException e2) {
logger.info("The Cycles object was not detected");
...
以上日志均未输出。
public static Cycles deserialize() throws IOException {
FileInputStream fileIn = null;
ObjectInputStream in = null;
try {
fileIn = new FileInputStream(
System.getProperty("user.home") + System.getProperty("file.separator") + ".cycles");
in = new ObjectInputStream(fileIn);
return (Cycles) in.readObject();
} catch (IOException i) {
i.printStackTrace();
return null;
} catch (ClassNotFoundException e) {
e.printStackTrace();
return null;
} finally {
in.close();
fileIn.close();
}
}
IOException 不会覆盖 FileNotFoundException 吗?所以我希望从这个方法中得到 null 。但程序却崩溃了。
java.io.FileNotFoundException: C:\Users\activeUser\.cycles (The specified file cannot be found)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(Unknown Source)
at java.io.FileInputStream.<init>(Unknown Source)
at java.io.FileInputStream.<init>(Unknown Source)
at main.Cycles.deserialize(Cycles.java:56)
at main.FirefoxHeadlessServer.main(FirefoxHeadlessServer.java:141)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:61)
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:61)
Caused by: java.lang.NullPointerException
at main.Cycles.deserialize(Cycles.java:67)
at main.FirefoxHeadlessServer.main(FirefoxHeadlessServer.java:141)
... 5 more
您会得到一个
NullPointerException
,因为如果未找到文件,in
将为 null,并且调用 in.close();
(在 finally
块中)会抛出 NullPointerException
。
这就是为什么我们从 Java 1.7 开始就“尝试使用资源”:
public static Cycles deserialize() {
try (FileInputStream fileIn = new FileInputStream(
System.getProperty("user.home") + System.getProperty("file.separator") + ".cycles");
ObjectInputStream in = new ObjectInputStream(fileIn)){
return (Cycles) in.readObject();
} catch (IOException i) {
i.printStackTrace();
return null;
} catch (ClassNotFoundException e) {
e.printStackTrace();
return null;
}
}