为什么IOException没有覆盖FileNotFoundException?

问题描述 投票:0回答:1

我尝试反序列化文件并得到 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
java serialization
1个回答
0
投票

您会得到一个

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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.