未实现可序列化接口(interface)的 Java 对象序列化

标签 java serialization exception-handling

我有以下代码。

动物.java

   public class Animal{
        String name;
        int age;

        public Animal(){
            name="default name";
            age=0;
        }

    }

猫.java

  public class Cat extends Animal{
        int legs;
        public Cat(){
            super();
            this.legs=10;
        }
    }

测试.java

import java.io.*;

public class Test{

    public static void main(String[] args){

        try{
            Cat c1 = new Cat();
            FileOutputStream fileStream = new FileOutputStream("myobjects.ser");
            ObjectOutputStream objectStream = new ObjectOutputStream(fileStream);
            objectStream.writeObject(c1);
        }catch(Exception e){
            e.printStackTrace();
        }   

    }
}

这段代码没有任何问题。没有抛出异常。我期待一个异常,因为 cat 类没有实现可序列化接口(interface)。

为什么我的代码有效?

最佳答案

程序确实会抛出异常,只是您没有找对地方。

方法 e.printStackTrace() 打印到 System.err (STDERR) 流,NOT 到标准控制台输出 (STDOUT ).您很可能没有查看正确的流。大多数 IDE 会显示 System.err,但我不能代表你。

修复方法是调用 System.out.println(e.getMessage())。这会将异常消息打印到 STDOUT。如果你想打印堆栈跟踪,你应该调用 e.printStackTrace(System.out)

最好找到一种方法来查看 System.err (STDERR) 流,因为典型的 System.out 用于正常的程序输出,而不是错误。您可以调用 System.err.println(e.getMessage()) 获取异常消息,调用 e.printStackTrace(System.err) 获取堆栈跟踪。

关于未实现可序列化接口(interface)的 Java 对象序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29519510/

相关文章:

java - 添加新成员变量后反序列化旧对象: Java

java - 在android中保存数据对象持久内部列表

java - 如何忽略 Java 中的异常

.net - 错误记录类中最好的异常处理策略是什么?

java - 输入更新后不存储 JTextArea 中的预期字符串

java - 如何将 Wikia 链接放入 Android 中的 ListView 中,也许 MediaWiki API 会有所帮助,但我不确定该去哪里

vb.net - 当基础类略有更改时,我可以反序列化对象吗?

c# - 创建我自己的异常 c#

java - 如何使用 java Apache POI 在 excel 中动态构建边框

java - if-else结构