Java对象序列化而不实现可序列化接口

时间:2015-04-08 15:54:35

标签: java serialization exception-handling

我有以下代码。

Animal.java

   public class Animal{
        String name;
        int age;

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

    }

Cat.java

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

Test.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类没有实现可序列化的接口。

为什么我的代码有用?

2 个答案:

答案 0 :(得分:1)

程序会抛出异常,你只是找不到合适的位置。

方法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)来获取堆栈跟踪。

答案 1 :(得分:-1)

首先,你不应该捕捉“例外”。不好的做法。

其次,如果要“查看”异常,请让main()方法抛出NotSerializableException(使用throws)。