Java对象序列化而不实现可序列化接口
我有以下代码 Animal.javaJava对象序列化而不实现可序列化接口,java,serialization,exception-handling,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; pub
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类尚未实现可序列化接口
为什么我的代码可以工作?首先,您不应该捕获“异常”。坏习惯
其次,如果您想“查看”异常,让main()方法抛出NotSerializableException(使用throws)。如果程序确实抛出异常,您只是找不到正确的位置 方法
e.printStackTrace()
打印到System.err
(STDERR)流,而不是标准控制台输出(STDOUT)。很可能您没有看到正确的流。大多数IDE都会显示System.err
,但我不能代表你说
修复程序将调用System.out.println(e.getMessage())
。这将把异常消息打印到标准输出。如果要打印堆栈跟踪,应调用e.printStackTrace(System.out)
更好的做法是找到查看
系统.err
(STDERR)流的方法,因为典型的系统.out
用于正常程序输出,而不是错误。您可以调用System.err.println(e.getMessage())
来获取异常消息,调用e.printStackTrace(System.err)
来获取堆栈跟踪。I获取异常。重新编译并重新运行你的代码。我没有得到任何。使用open-jdk7I获得java.io.NotSerializableException。选中welle.printStackTrace()将其打印到您可能看不到的错误流。这就是为什么您认为代码在无声完成时工作。System.out.println(e)这个答案是不正确的。。。(第一句是,但这并不能回答问题)我宁愿使用System.out.println(e.getMessage())
或System.err.println(e.getMessage())代码>。对于堆栈跟踪,e.printStackTrace(System.out)
将它打印到STDOUT,并且e.printStackTrace(System.err)代码>将打印到STDERRYou是正确的。写我的答案时有点心烦意乱!我将稍后编辑。我已编辑了您的答案,以包含我的观察结果。希望对你有帮助